"Говорить про стандартные компоненты можно не начинать" - чем же вам не нравится работающее решение? Зачем тогда вообще брать битрикс, возьмите фреймворк и делайте на нем.
По стандартному:
Фильтр должен (обязательно) подключаться раньше каталога, поэтому "т.к. нельзя заранее сказать какой компонент раньше подключится." не верно.
Общаются они через глобальную переменную $GLOBALS["arrFilter"].
Лучший пример это посмотреть стандартный комплексный компонент каталога, в нем все вроде ясно. Если не нравится, можете взять хотя-бы за основу и переписать как хотите