Be sure that the base href tag in each template is called uncached (with the exclamation point):
<base href="[[!++site_url]]" />
Also, make sure that each context has these settings and they are set appropriately:
base_url
http_host
site_url
It that doesn't do it I would suspect that when the parser handles a link tag, it uses the value of the "base href" tag on the current page's template rather than consulting the context of the resource being linked to.
Someone more familiar with ContextRouter can probably give you a better answer.
Worst-case, a fairly simple custom snippet could take the place of those link tags and build the URL you want based on the target resource's context_key and a call to the context's makeUrl() method.
You might also want to take a look a
XRouting.