O problema é que o resultado da sua subconsulta é interpretado como uma string, não como um array. Isso ocorre porque essas duas formas são semanticamente diferentes:
~~ ANY ('...') -- will be interpreted as an array literal
e
~~ ANY (SELECT ...) -- will compare with all query results in turn
Então você pode simplesmente escrever:
WHERE lower(name) ~~ ANY
(SELECT DISTINCT '%' || lower(brand) || '%'
FROM my_table
WHERE source = 'Orig')