El problema es que el resultado de su subconsulta se interpreta como una cadena, no como una matriz. Esto se debe a que estas dos formas son semánticamente diferentes:
~~ ANY ('...') -- will be interpreted as an array literal
y
~~ ANY (SELECT ...) -- will compare with all query results in turn
Así que simplemente puedes escribir:
WHERE lower(name) ~~ ANY
(SELECT DISTINCT '%' || lower(brand) || '%'
FROM my_table
WHERE source = 'Orig')