Держите:
SELECT *
FROM public.bazaar_items
WHERE charity IS TRUE
UNION
SELECT *
FROM public.bazaar_items
OFFSET (random()*B) LIMIT R;
Где B -- константа, целое число, 1 <= B <= MAX - R.
Однако я бы на Вашем месте не стал лишний раз задействовать вычислительные ресурсы сервера СУБД вызывая на нём random(), а отдал бы это на растерзание бэкенду, переписав последнюю строчку запроса как:
OFFSET (F) LIMIT R;
Где F -- целое число, генерирующееся в диапазоне 1 <= F <= MAX - R на бэкенде.
MAX -- максимальное количество товаров.
R -- максимальное количество выводимых товаров (в Вашем случае 4).
Старайтесь держать золотую середину в составлении запроса в плане его чтения и понимания/производительности, используйте кэширование. Это и будет эффективным.