Yes, that now works properly. When comparing that with the spread address, the spread is easily seen in this case to be superior to using Object.assign.
Spread:
const user2 = {...user, address: { ...user.address, city: 'Quebec' }};
Object.assign:
const user2 = {
...user,
address: Object.assign({}, user.address, {city: 'Quebec'})
};