Сначала из первого массива сделаем объект, где значениями будут его элементы, а ключами - значения их, элементов, свойства name:
const obj1 = Object.fromEntries(arr1.map(n => [ n.name, n ]));
Затем можно собрать новый массив:
const newArr2 = arr2.map(n => ({ ...obj1[n.name], ...n }));
Или обновить существующий:
arr2.forEach(n => {
const obj = obj1[n.name];
if (obj) {
n.id = obj.id;
}
});
UPD. Вынесено из комментариев:
можно ли исключить объекты у которых не изменился value? То есть что бы этих объектов не было в итоговом массиве.
const newArr2 = arr2.reduce((acc, n) => (
obj1[n.name]?.value !== n.value && acc.push({ ...obj1[n.name], ...n }),
acc
), []);