Given the requirement is for each IPv6 only machine is to host an arbitrary number of different services I think you are out of luck.
This is basically the same problem as a single public IPv4 address and a collection of servers behind it on a network with RFC1918 range. (e.g. a Home broadband type set up)
If they were all hosting a service that incapsulates the host name in the protocol (e.g. HTTP or HTTPS with SNI) then the dual homed machine could easily proxy for the them. But at a pure IP level there is no way to do this as the IPv4 only client will use DNS to resolve the address of the target, this can return 2 options:
- the IPv4 address of the gateway, it then opens a connection to the gateway, but now the end target information has been lost (as it's not carried in the protocol) so it doesn't know where to forward the packet to.
- the IPv6 address of the end target, but being IPv4 only it has no way to reach it.
The best halfway house approach I can think of is using SSH to setup client local port forwarding via the gateway (as a Bastian host) to the target machine. This would mean you would need to start a SSH connection on each client before trying to access the target server. And you would need to know what services that server offered before starting the ssh session as it would need to set up the forwarding for each service up front.