во первых, если ты меняешь сами объекты, то незачем создавать новые массивы. Просто обходи вложенным циклом и ставь значение, если key совпал. Потом возвращай тот же массив.
во вторых, чтобы каждый раз не обходить весь набор, естественным образом напрашивается идея сделать индекс: карту Map, где ключами будут key, а значениями - массивы объектов с таким key. Тогда обновление будет моментальное:
const update = (array, map, key, val) => {
const arr = map.get(key);
if (arr) {
arr.forEach((obj) => {obj.val = val;}
}
return array;
};
но при изменении набора надо будет подправлять и индекс.