Так как у вас URL в error_page указан с http и доменом - подразумевается внешний редирект. Отсюда и 302. Для получения того, что вы хотите, пишите
error_page 503 /maintrance.html;
Так же, если вы хотите получить 200 в ответе, не обязательно описывать отдельный локейшн, можно решить все той же error_page, это будет так
error_page 503 =200 /maintrance.html;
И тогда location = /maintrance.html можно выкинуть.
UPD: Да, ступил. Так как error_page делает внутренний редирект, то если нет отдельного location /maintrance.html - сервер снова попадает в location / и получается бесконечный цикл редиректов. Так что в таком случае location /maintrance.html нужен.
Попутно хочу акцентировать внимание на другом способе, более популярном, особенно если нам не нужно выдавать 503.
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files /maintrance.html $uri $uri/ =404;
}
try_files перебирает указанные аргументы пока не встретит существующий на диске. Т.е. в такой конфигурации достаточно создать /usr/share/nginx/html/maintrance.html - начинает выдаваться он, если его удалить - начинают работать обычные запросы (параметр $uri и $uri/).