Каким образом получить новый массив из текущего?
1. Сгруппировать товары по catID и категории также:
$products = [];  // ваш массив с товарами

/** 
 *  Группирует любой массив  массивов по любому полю $indexKey в качестве индекса
 */
function groupBy(array $input, string $indexKey): array
{
    return array_reduce($input,  function($res, $data) use ($indexKey){
        if (!isset($data[$indexKey])) {
             return $res;
        }
        
        $res[$data[$indexKey]][] = $data;
            
        return $res;
    }, []);
}

$groupedProducts = groupBy($products, 'catID');
// такое работает при условии, что категория с одним id будет иметь последнее название из найденных, 
// то есть если id один, а название разные, то возможны не ожидаемые результаты
$categories = array_column($products, 'catName', 'catID');

2. Потом просто идете в цикле и выводите:
foreach($groupedProducts as $catId => $catProducts) {
     // тут доступно название категории $categories[$catId] и ее $catId

     foreach($catProducts as $product) {
          // тут выводим сами товары $product
     }
}

Для PHP 5 нужно [] заменить на array(), предлагаю это сделать самому :)
Сразу получить из БД с нужной группировкой
$sql = "SELECT catID, catName, p.* FROM prod p, cat c WHERE c.id=p.catID";
$data = $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP);