Вот такой запрос можно сделать, используя joinWith().
В модели Categories добавляем публичное поле product_count.
$query = Category::find()
->select(['*', 'product_count' => new \yii\db\Expression('COUNT(products.id)')])
->joinWith('products', false)
->groupBy('{{%categories}}.id')
В итоге в выборку попадёт product_count, которым можно использовать. В этом параметре будет хранится количество товаров для каждой категории.
Подставьте свои значения и всё должно работать.
Подробней о работе со связными данными можно посмотреть
здесь.