Assumindo que eu entendi o problema corretamente: Você tem duas conexões "internet" através de duas interfaces locais e gostaria que as respostas passassem pelo mesmo caminho do qual elas foram recebidas.
Posso pensar em duas soluções limpas:
1) Faça o roteamento de políticas com base no IP de origem. Se o IP de origem é o da eth0, então deve usar um gateway, caso contrário, o outro. Isso é semelhante ao que você fez. Do alto da minha cabeça:
ip route add default via GW1 table gw1
ip route add default via GW2 table gw2
ip rule from IP1 table gw1
ip rule from IP2 table gw2
2) Marque os pacotes de entrada com iptables, rastreamento de conexão e o destino CONNMARK. Restaure essa marca em todos os pacotes de saída e faça o roteamento de políticas com base na marca. Mais uma vez, do alto da minha cabeça:
iptables -A INPUT -i wlan0 -t mangle -j MARK --set-mark 1
iptables -A INPUT -i eth0 -t mangle -j MARK --set-mark 2
iptables -A INPUT -j CONNMARK --save-mark
iptables -A OUTPUT -j CONNMARK --restore-mark
ip route add default via GW1 table gw1
ip route add default via GW2 table gw2
ip rule fwmark 1 table gw1
ip rule fwmark 2 table gw2
O texto acima pode precisar de alguns ajustes, mas essa é a ideia geral.