Да, по умолчанию весь объект рекурсивно делается наблюдаемым. То есть можно отслеживать изменение a[i], и a[i].a
Тут главное - правильно читать и записывать значения.
Например, у тебя такой расклад:
<Table>{a.map(item => <Row key={item.id} item={item} />)}</Table>
Если ты делаешь
a[i].a = newValue, то перерендерится только один Row
А если
a[i] = {...}, то уже весь компонент, в котором цикл (хотя все Row, кроме измененного, не перерендериваются внутри себя).
Ещё плохой вариант:
<Table>{a.map(item => <Row key={item.id} a={item.a} />)}</Table>
здесь даже при
a[i].a = newValue будет как при
a[i] = {...}, потому что компонент с циклом подписывается на все
a[i].a, а не только на все
a[i]