A explicação é, de acordo com o manual :
O corpo do
DO
instrução é uma string cotada em dólar. Portanto, não há interpolação dentro da string. Como deve ser uma string literal, você também não pode concatenar strings em tempo real. O manual:
Mas você pode concatenar a string e depois executá-la.
Minha ênfase em negrito. Você só precisa acertar a citação:
test=# \set test 'some value'
test=# \set code 'DECLARE v_test text := ' :'test' '; BEGIN RAISE NOTICE ''test var is: %'', v_test; END'
test=# DO :'code';
NOTICE: test var is: some value
DO
test=#
Mas prefiro criar uma função (temporária) e passar o valor como parâmetro (onde funciona a interpolação do psql). Detalhes nesta resposta relacionada no dba.SE: