Il problema è che il risultato della tua sottoquery viene interpretato come una stringa, non come un array. Questo perché queste due forme sono semanticamente diverse:
~~ ANY ('...') -- will be interpreted as an array literal
e
~~ ANY (SELECT ...) -- will compare with all query results in turn
Quindi puoi semplicemente scrivere:
WHERE lower(name) ~~ ANY
(SELECT DISTINCT '%' || lower(brand) || '%'
FROM my_table
WHERE source = 'Orig')