Нет никакой магии.
При использовании прокси серверов всегда нужно четко определять, что бекенд говорит прокси, а что клиенту.
А говорить он может в общем-то через заголовки, то есть какие-то заголовки предназначаются для прокси, а какие-то дальше клиенту.
Так вот, заголовок Expires в вашем случае предназначен для прокси, для директивы proxy_cache, а именно, на какое время кешировать, так как вы не указали его в proxy_ignore_headers.
Почему он его изменяет на -1?
Потому, что у вас в заголовке от бекенда отсутствует длинна ответа: Content-Length, а ответ передается частями до просветления. Ну там есть особенности с этим, да.
В общем, если хотите отдать Expires клиенту, то добавьте этот заголовок в proxy_ignore_headers, если он не для прокси, либо добавьте директиву expires off;