You might find this KB article useful.
http://kb.juniper.net/KB10458
This article uses PPTP as the example but you can use the destination NAT configuration for your application as well. To understand why you were not hitting the correct policy and why the static route helped, you need to understand the order in which the a packet is processed through flow.
1. First thing that is checked upon seeing a packet in flow is to check if there is already a session for the packet based on source/destination IP and port and ingress/egress interface.The ingress interface isknown at this point. If session is found, then the packet is sent through fast path processing.
2. If no session found then first packet processing is done. A route lookup is performed and assuming there is a route to a next-hop, it will know which egress interface to forward the packet to.
3. Once route lookup determines egress interface we next perform policy lookup. Each transit interface must be bound to a security zone. Thus based on the ingress and egress interfaces we can determine the to-zone from-zone context for the policy lookup.
4. Once policy lookup is done, assuming a policy exists which permits the packet, then any NAT will be applied before packet is forwarded. The packet is then sent through fast path processing and leaves flow.
The above is a bit oversimplified, but generally true. So based the above, step 2 is the reason why you could not reach the destination NAT policy. The route lookup determined that the destination IP was in same zone as the ingress interface. Thus this becomes an intra-zone policy. When you added the static route pointing the next-hop to the inside interface, then this became an inter-zone policy lookup.
Hope thats make sense.
-Richard