Как ускорить работу моего кода?
Отсортировать массивы по id и за один параллельный проход найти сразу добавленные, удалённые и изменённые.
oldArray.sort((a, b) => a.id - b.id);
newArray.sort((a, b) => a.id - b.id);
oldIdx = 0;
newIdx = 0;
while (oldIdx < oldArray.length || newIdx < newArray.length) {
  if (oldIdx >= oldArray.length || oldArray[oldIdx].id > newArray[newIdx].id) {
    console.log(`Added id newArray[newIdx].id`);
    newIdx += 1;
    continue;
  }
  if (newIdx >= newArray.length || oldArray[oldIdx].id < newArray[newIdx].id) {
    console.log(`Deleted id oldArray[oldIdx].id`);
    oldIdx += 1;
    continue;
  }
  if (oldArray[oldIdx].x !== newArray[newIdx].x) {
    console.log(`Changed id newArray[newIdx].id`);
    oldIdx += 1;
    newIdx += 1;
  }
}
На основе ответа Rsa97, написал вот такой код.

const deleted = [], updated = []
for (let oldidx = 0, newidx = 0; oldidx < current_data.length || newidx < new_data.length;) {
  
  if (newidx >= new_data.length || current_data[oldidx]?.id < new_data[newidx].id) {
    deleted.push(current_data[oldidx])
    oldidx++
    continue
  }
  
  if (oldidx >= current_data.length || current_data[oldidx].id > new_data[newidx]?.id || !lodash.isEqual(new_data[newidx], current_data[oldidx])) {
    updated.push(new_data[newidx])
    oldidx++
    newidx++
    continue
  }
  
  oldidx++
  newidx++
}

Мне было важно, чтобы обновлённые и добавленные данные были в одном массиве,
поэтому я сделал именно так. Сейчас время работы ~1.5 секунды
Еще появился вариант использовать свой метод, но заменить find на бинарный поиск,
но я его не тестировал.