O problema é que #/cat/tom
é uma instrução para o aplicativo do lado do cliente e não para o aplicativo do lado do servidor. O que significa que ele precisa ser enviado para o cliente (por meio de um redirecionamento).
Por exemplo:
location = /tom {
return 302 /#/cat/tom;
}
location / {
proxy_pass http://localhost:8080;
...
}
Você menciona na sua pergunta que está tentando fazer isso sem um redirecionamento, mas infelizmente, se observar a estrutura de um URL, você notará que qualquer coisa após o #
não é enviado para o servidor. Veja este documento para mais.