Прямым запросом как-то не комильфо. Я бы извлёк массив ID элементов для каждого из значений свойства и нашёл бы пересечение через array_intersect. Оно и быстрее в разработке, чем кнструктор запроса писать, и поддаётся дальнейшей оптимизации.
Если проект высоконагруженный то лучше вообще отказаться от БД... Но это лирика. 2ТС: А вы не думали пересмотреть механизм хранения ваших данных? Может как-то закодировать ваши цвета и хранить только хэш?
по сути подзапросами вы выбрали список всех айдишников по каждому цвету отдельно. а потом по этому списку айдишников выбрали общий список айдишников. Абсурдно?