I don't have a terribly specific idea about how to improve this, but is there some way that we could, at least periodically, check the socket to see whether it's dead? Noticing the demise of the client after a configurable interval (maybe 60s by default?) would be infinitely better than never.
Does it make any difference if the query is making changes? If the query is just computing a result and returning it to the client, there is no point in continuing once the socket is closed. But if it is updating data or making DDL changes, then at least some of the time it would be preferable for the changes to be made. Having said that, in normal operation one wants, at the client end, to see the message from the server that the changes have been completed, not just fire off a change and hope it completes.
I prefer simple solution without any "intelligence". It is much safer to close connect and rollback. Then it is clean protocol - when server didn't reported successful end of operation, then operation was reverted - always.