Сортировка состоит из двух частей: визуального отображения (стрелочки и т.п.) и реальной сортировки данных.
Если вы внимательно посмотрите на код, то у вас есть фрагмент:
$sort = $grid_options->GetSorting(['sort' => ['ID' => 'DESC'], 'vars' => ['by' => 'by', 'order' => 'order']]);
Если вы поставите дебаг переменной `$sort` и будете смотреть как он меняется при обновлении страницы (щелкать по столбцам и обновлять страницу), то вы увидите что он содержит там ключ стобца из HEADERS (COLUMNS) и направление (ASD/DESC), и все это будет вроде бы в `$sort['sort']`.
Далее, если вы посмотрите на фрагмент кода:
$res = \CIBlockElement::GetList(array("ID"=>"ASC"), $filterD, false, $nav_params);
То благодара документации по методу вы узкаете что первым параметром передается массив для сортировки результатов и в вашем случае он всегда фиксированный - по возрастанию ID.
Если вместо фиксированного параметра вы передадите тот самый набор из сорт то у вас все заработает.