Тоже столкнулся с такой проблемой, но у меня дерево из 4-5 уровней, разные варианты разобрал, но остановился просто на отдельных запросах
1.
$query = Product::find();
$query->select(['category_id', 'count' => 'count(`id`)']);
$query->visible();
$query->andWhere(['category_id' => $categoryIds]);
$query->groupBy('category_id');
$query->asArray();
Получили сколько продуктов у каждого раздела
2. Запрос всего дерево в обратном порядке, чтоб последние элементы были потомками, затем простым циклом обходил все дерево и добавлял кол-во элементов, если менялся уровень или родитель то сброс