У меня правило чуть мягче: делаю копию только когда объект (или объект любой глубины вложенности) необходимо модифицировать. Object.assign({}, obj, patch) чаще всего используется мною для этого. В остальных случаях — пробрасываю без копии.
ну да, копирование объектов _маст хэв_ только для реакта - потому что там под капотом shadow dom строится в зависимости от того осталась ссылка на объект или вернулась новая копия
ну я тоже не возвращаю копии если не чистый объект передается а какой-нибудь метод какого-нибудь класса, особенно неизвестного... куда там может сериализация завести... )
О, мне вот иногда кажется, что я в качестве контейнера данных просто объекты использую там, где уже можно было бы выделить класс. Иногда эта граница для меня расплывчата :/