Buen aporte. Amplio un poco:
La magia del operador spread es expandir el contenido de los objetos (aunque tambien vale para arrays). Por eso el objeto compuesto no se actualiza al modificar uno de los objetos que le dieron origen.
Algo chistoso, o no tan chistoso si no se tiene cuidado:
const obj1 = {'a':1, 'b':2}
const obj2 = {'c':3}
const obj3 = {'a':4}
const objAll = {...obj1, ...obj2, ...obj3}
objAll
// {a: 4, b: 2, c: 3}
El operador spread siempre trabaja de forma secuencial, y si existe algún campo que se llame igual en dos objetos, el segundo machaca al primero 😉