Você não pode corresponder em uma string de consulta em um rewrite . Então você precisa verificar o argumento diretamente.
Por exemplo:
if ($arg_discount ~ ^free) {
rewrite ^/join_trial /test2? permanent;
}
rewrite ^/join_trial /test? permanent;
E suspeito que você realmente não deseja enviar redirecionamentos 301, pois o usuário verá /test ou /test2 em sua barra de endereço. Talvez você realmente queira processar essas URLs apenas internamente? Nesse caso, altere permanent para last .