So first, a question: Can v4 devices talk to v6 devices?
Not without one of the transition mechanisms (NAT64, 6to4, Teredo). There's no space for a v6 address in the v4 dest header field.
If I have an older device, such as a printer, that can only talk v4, then in order to talk to it, I need a v4 address.
Given that there will be some devices out there that can only talk v4, then there needs to be some way for v4 machines to talk to v6 machines.
Generally this is done by not removing the v4 address from your v6-capable machines. The v6-capable machines are inevitably also capable of talking v4, and they're hooked up to the same ethernet segment as your v4-only devices, so they'll also be getting v4 addresses. They just use those when they want to talk to a v4-only machine.
So, is it possible for a v6 host to initiate a connection to a v4 device by using some magic prefix to indicate "the bottom 4 bytes contain a v4 address, and you, router, are supposed to pretend that you are talking v4 using that"?
This is roughly what NAT64 does. (I will note however that NAT64 has all of the problems that NAT44 does, plus a few extra of its own.)
If so, the next question is: when the v4 device wants to respond, what does it put into it's destination IP field to get back to the v6 device?
It uses whatever was in the source field, which will be the v4 address of the NAT64 gateway. The gateway is responsible for maintaining state for each connection, so it knows what the original v6 src address was.
If I cannot talk to a v4-only device from a v6-only host, then I need to have a mixed 4/6 machine.
Yep. Dual stack is the expected (and easiest) migration method.
The need for routers to be able to translate between v4 and v6 to support old hardware leads into the question about V8.
This isn't really necessary. As I say: dual stack is the expected way to deal with old hardware.