Le problème est que le résultat de votre sous-requête est interprété comme une chaîne et non comme un tableau. En effet, ces deux formes sont sémantiquement différentes :
~~ ANY ('...') -- will be interpreted as an array literal
et
~~ ANY (SELECT ...) -- will compare with all query results in turn
Vous pouvez donc simplement écrire :
WHERE lower(name) ~~ ANY
(SELECT DISTINCT '%' || lower(brand) || '%'
FROM my_table
WHERE source = 'Orig')