Как обновлять значения объекта, а не переписывать их?
Если откинуть шелуху, вопрос сводится к тому, как объединять объекты «глубоко» — как делать deep merge.
Довольно частый вопрос и есть несколько решений: использовать готовую библиотеку или написать рекурсивный обход свойств объекта: если свойство это объект, то (повторить для него). Если свойство примитив то скопировать.
Нашел функцию для объединения двух объектов с вложенными в них объектами
const merge = (target, source) => {
    for (const key of Object.keys(source)) {
        if (source[key] instanceof Object) Object.assign(source[key], merge(target[key], source[key]))
    }

    Object.assign(target || {}, source)
    return target
}