как вариант:
....
Поставить эластик или сфинкс и искать по нему?
какой ещё selected, зачем?
$IdsProducts = Product::WhereHas('categories', function ($q) use ($node) {
$q->where('category_id', $node->id);
})->pluck('id')->toArray();
$discounts = Discount::WhereHas('product', function ($q) use ($IdsProducts) {
$q->whereIn('product_id', $IdsProducts);
})->get();
return $discounts;
Тут на примере настройки шаблона Аспро.Максимум, в шаблоне Аспро.Next все немного по другому.