В общем решил сделать другим путём, сначала запускаю поиск по ответственным, потом по наблюдателям, насколько это правильно или производительней незнаю. 
КОД
global $USER;
if (empty($_POST["OLDUSER"]) || empty($_POST["NEWUSER"])) {
    echo "Не указаны ID пользователей.";
    exit;
}
$oldUserId = intval($_POST["OLDUSER"]);
$newUserId = intval($_POST["NEWUSER"]);
$creationDateFrom = $_POST['CREATION_DATE_FROM'];
$creationDateTo = $_POST['CREATION_DATE_TO'];
$oldUser = CUser::GetByID($oldUserId)->Fetch();
$newUser = CUser::GetByID($newUserId)->Fetch();
if (!$oldUser) {
    echo "Не найден старый пользователь с таким ID";
    exit;
} elseif (!$newUser) {
    echo "Не найден новый пользователь с таким ID";
    exit;
}
$creationDateFrom = !empty($creationDateFrom) ? ConvertTimeStamp(strtotime($creationDateFrom), "FULL") : null;
$creationDateTo = !empty($creationDateTo) ? ConvertTimeStamp(strtotime($creationDateTo) + 86400, "FULL") : null;
if (!$creationDateFrom || !$creationDateTo) {
    echo "Не указаны даты создания задач.";
    exit;
}
// Первый этап: ищем задачи, где старый пользователь является ответственным
$filterForResponsible = array(
    '::LOGIC' => 'AND',
    '>=CREATED_DATE' => $creationDateFrom,
    '<=CREATED_DATE' => $creationDateTo,
    'RESPONSIBLE_ID' => $oldUserId,
    'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
);
// Обновляем наблюдателей
$messages = [];
$tasksUpdated = processTasks($filterForResponsible, $newUserId, $USER->GetID(), $messages);
if ($tasksUpdated === 0) {
    // Второй этап: ищем задачи, где старый пользователь является постановщиком
    $filterForCreator = array(
        '::LOGIC' => 'AND',
        '>=CREATED_DATE' => $creationDateFrom,
        '<=CREATED_DATE' => $creationDateTo,
        'CREATED_BY' => $oldUserId,
        'REAL_STATUS' => array(CTasks::STATE_COMPLETED),
    );
    $tasksUpdated += processTasks($filterForCreator, $newUserId, $USER->GetID(), $messages);
}
if ($tasksUpdated === 0) {
    $messages[] = "Не найдено задач для обновления.";
}
echo implode("<br>", $messages);
function processTasks($filter, $newUserId, $currentUserId, &$messages) {
    $res = CTasks::GetList([], $filter);
    $tasksUpdated = 0;
    while ($arTask = $res->GetNext()) {
        $taskId = $arTask["ID"];
        $taskItem = new CTaskItem($taskId, $currentUserId);
        $taskData = $taskItem->getData();
        
        $auditors = $taskData["AUDITORS"] ?? [];
        if (!in_array($newUserId, $auditors)) {
            $auditors[] = $newUserId;
            $obTask = new CTasks;
            $updateFields = [
                "AUDITORS" => $auditors
            ];
            $success = $obTask->Update($taskId, $updateFields);
            if ($success) {
                $messages[] = "Задача с ID $taskId: Новый наблюдатель добавлен.";
                $tasksUpdated++;
            } else {
                if ($e = $APPLICATION->GetException()) {
                    $messages[] = "Ошибка при обновлении задачи ID $taskId: " . htmlspecialchars($e->GetString());
                }
            }
        } else {
            $messages[] = "Задача с ID $taskId: Наблюдатель с ID $newUserId уже существует.";
        }
    }
    return $tasksUpdated;
}