Вам не кажется, что вы пытаетесь изобрести один запрос для решения нескольких совершенно разных задач? Вряд ли это положительно отразится на скорости работы приложения.
1. Когда вы отображаете список отелей, то вряд ли вам нужен полный список удобств, да еще сгруппированный... Просто где вы их собираетесь отображать? Может достаточно кол-ва или каких-то важных, заведомо выбранных удобств (бесплатная парковка, например)?
2. Когда вы будете искать отели по критериям, то там будет совершенно другой запрос.
3. Все эти удобства нужны только при отображении одного отеля. Так почему не сделать несколько запросов?
$amenities = $hotel->amenities()->with('groups')->get();
а потом с помощью методов
Collection сгруппировать их так, как вашей душе угодно.