Eu encontrei algo que ajudou. Eu forneci o comando password alter após o script sair do EOF. Então, aqui está o que funcionou para mim:
su - postgres <<'EOF'
. /var.src
psql
CREATE ROLE john;
ALTER ROLE john WITH LOGIN;
CREATE DATABASE john;
ALTER DATABASE john OWNER TO john;
\q
EOF
. /var.src
sudo -u postgres psql -c "ALTER USER john WITH PASSWORD '$JOHNPASSWORD';"
Isso porque eu chamei o arquivo variável novamente após o EOF. Tenho certeza de que isso tem a ver com minha suposição anterior de escapar da citação. Mas isso também funciona.