Het probleem is dat het resultaat van uw subquery wordt geïnterpreteerd als een string, niet als een array. Dit komt omdat deze twee vormen semantisch verschillend zijn:
~~ ANY ('...') -- will be interpreted as an array literal
en
~~ ANY (SELECT ...) -- will compare with all query results in turn
U kunt dus gewoon schrijven:
WHERE lower(name) ~~ ANY
(SELECT DISTINCT '%' || lower(brand) || '%'
FROM my_table
WHERE source = 'Orig')