Если вы не передаете объект в PHP, PHP не передает значения по ссылке. $ res является копией значения, а не ссылкой на исходное значение. Если вы знаете, что делаете, вы можете пройти по ссылке. При передаче по ссылке изменение $ res приведет к изменению исходных данных. Вы передаете по ссылке, добавляя префикс &
к переменной или аргументу.
Так как это вложенный foreach, вам также придется передавать $ result по ссылке, чтобы не быть копией элемента $ results.
foreach ($results as &$result) {
foreach ($result as &$res) {
foreach ($dates as $date) {
if(!array_key_exists($date,$res)) {
$res = array_merge($res,[$date => '0']);
}
}
}
}