Почему foreach так работает?
foreach ($children as $key => $child) {
    $children[$key]['href'] = $this->url->link('product/category', 'path='.
    $this->request->get['path'].'_'.$child['category_id'].$url);
}
или такforeach ($children as &$child) {
    $child['href'] = $this->url->link('product/category', 'path='.
    $this->request->get['path'].'_'.$child['category_id'].$url);
}
Описание оператора foreach
Потому что итератор по умолчанию создаёт копию объекта. Используйте ссылку:foreach ($children as &$child) {
...
}