Как оптимизировать этот php код?
Сравнить пересечение массивов можно так: https://www.php.net/manual/ru/function.array-diff.php

Но возможно еще быстрее будет залить все в базу, во временную таблицу (load data infile) и потом добавить куда нужно используя insert ignore.
1. создать временную таблицу (без индекса)
2. load data infile ...
3. создать индекс по id
4. insert ignore into ... select (или on duplicate key update?)
5. удалить временную

20к записей должно обрабатываться за несколько секунд. Ну может секунд за 20, если сервер совсем слабый.
я думаю, даже in_array будет быстрее чем это.
Но по-хорошему надо сделать значения индексами
тогда проверка будет проходить мгновенно
$base = array_flip(array_column($base, 'ID'));
foreach($data as $dates) {
    if (!isset($base[$dates['ID']])) {
            $itog[] = $dates;
    }
}