Das Problem ist, dass das Ergebnis Ihrer Unterabfrage als Zeichenfolge und nicht als Array interpretiert wird. Dies liegt daran, dass sich diese beiden Formen semantisch unterscheiden:
~~ ANY ('...') -- will be interpreted as an array literal
und
~~ ANY (SELECT ...) -- will compare with all query results in turn
Sie können also einfach schreiben:
WHERE lower(name) ~~ ANY
(SELECT DISTINCT '%' || lower(brand) || '%'
FROM my_table
WHERE source = 'Orig')