Это цикл нужен вам.
На первой итерации вы запрашиваете ид потомков родителей, на каждой следующей - потомков выбранных на предыдущей. Как только выборка потомков пуста - так и останавливаете цикл.
Видимо, никак. ну, либо подзапрос выполнить как RIGHT JOIN с основным запросом, тогда сначала выполнится подзапрос, затем основной запрос и при их джойне вернется 0 рядов.
правда, не представляю, зачем вам это нужно...
UPDATE ps_category
SET ps_category.active = '0'
JOIN ps_category_product USING(category_id)
JOIN ps_product USING(id_product)
WHERE SUM(ps_product.active)=0
GROUP BY ps_product.id_product