Това е, защото все още имате категориите в масива, когато вече сте ги присвоили. Това, което можете да направите, е да направите функцията, в която предавате аргумента като препратка, и цикъла in foreach, за да имате възможността да изчистите масива от тази вече присвоена категория. Опростена реализация по-долу.
function getChildren(&$rows, $p = 0) {
$r = array();
foreach($rows as $row_id => $row) {
if ($row['parent_node']==$p) {
$r[$row['product_category_code']] = getChildren($rows, $row['product_category_code']);
unset($rows[$row_id]);
}
}
return $r;
}