You could store the result of your "ugly" subquery in a temp table.
You could also store it in a View, although that would only help for the readability of the query.
You could also modify your original ugly sub-query to also incorporate this union, making it even uglier.
I can't really see a way without using a union, or running the sub-query twice