The kernel picks the shortest route when sending a response to an incoming packet. What you did caused the following:
Code:
(source address of request)-------------->(address of eth0)kernel composes response, shortest route to src via eth1
^---------------(address of eth1)
This doesn't work because the original request from (source address, call it 1.2.3.4) went to the IP of eth0 (well, the VIP on the load balancer actually), call it 5.6.7.8. However the box receiving that packet decided that eth1 was a shorter route back to 1.2.3.4, so it composes a response packet out eth1 and gives the response a source address of 6.7.8.9 (the IP of eth1). When the response arrives at 1.2.3.4 that host looks at the packet and sees that it came from 6.7.8.9, but 1.2.3.4 never made a request to 6.7.8.9, so it throws away the packet and waits for a response from 5.6.7.8 (which never comes).
It is possible to make asymmetric routing work, but you have to perform NAT or some other trickery to make sure the source of the return packets gets rewritten as the destination of the original request, rather than the IP of the interface that sends the response.
The situation you describe is usually called "triangular routing" because it takes the form: A sends to B, B sends packet through C, A gets response from C.