Eu encontrei esta pergunta no Stackoverflow que realiza o que eu estava procurando.
Eu acho que por qualquer motivo, mesmo que um retorno funcione dentro de um bloco servidor , ele não respeita nenhuma diretiva error_page . Isso pode ser um bug ou um comportamento intencional que eu não entendo. A solução é colocar o retorno dentro de um bloco local :
server {
listen 80;
root /var/www/html;
error_page 400 /400.html;
location = /400.html {
internal;
}
location / {
return 400;
}
}