Как составить запрос без подзапросов?
Я не знаком с тонкостями Oracle, но Вы можете попробовать так (SQL HAVING Clause):

select 
	 groups.id_group, 
	 groups.name_group, 
	 count(distinct users.id_user) size_group
from groups
join users on users.id_group = groups.id_group
group by groups.id_group, groups.name_group
having count(distinct users.id_user) between 1 and 5
;

SQL fiddle
В большинстве случаев интеллекта планировщика запросов хватит на то чтобы варианты с подзапросами, cte или having оказались по сути в плане выполнения идентичными. Поэтому тут на первый план скорее выйдет понятность/эстетичность самого текста запроса.

p.s. ну и заглядывая в будущее: вероятно когда-то критерий "от 5 до 10" может превратится в "от N до M", плюс "для только ... групп и только юзеров с признаками ..." -> запрос превратится в stored procedure с кучкой параметров и там возникнут свои нюансы хинтинга