Если цель не состоит в том, чтобы изменить исходный объект, то вы бы сделали это следующим образом:
let v = {
allMsgs: [
{ a: 111, b: [] },
{ a: 222, b: [] }
]
};
let w = { allMsgs: Object.assign([...v.allMsgs],
{ 1: Object.assign({}, v.allMsgs[1],
{b: ['newItem']}
)}
)};
console.log('updated =', w);
console.log('original =', v);
Обратите внимание, что здесь первый объект в allMsgs
все еще используется двумя объектами.Только тот, который вы хотели изменить, является (очевидно) отдельным.
В библиотеках, подобных immutable.js, есть хорошие методы для создания таких обновлений с использованием краткого синтаксиса.