That's permitted by the RFCs that define the IP protocol. Actually, to be more specific, it is permitted because it isn't expressly disallowed by RFC 792 (http://www.faqs.org/rfcs/rfc792.html).
Some kernel developers, when writing TCP/IP implementations, have just plain found it easier to write the code that generates ICMP reply packets such that the source address (of the reply packet) is the most convenient IP address laying around (usually the first interface, or the first interface to be configured).
Most people notice this the first time when using traceroute. Traceroute replies tend to come from the "nearest" interface, as one would expect. However, since traceroute is based on ICMP "ttl exceeded" errors, those packets can come from any IP address on the system.
I'm not saying that kernel developers are lazy, I'm saying that this kind of code is non-trivial. Figuring out which interface is "nearest" is actually rather difficult in many TCP/IP implementations because what interface a packet entered the system is not recorded. Carrying that information from cradle to grave just so that traceroute looks pretty is a waste.
Most people are not aware of this because (1) most hosts only have 1 IP address, or (2) many vendors have carefully crafted their TCP/IP implementation to go the extra step of making sure ICMP errors come from the IP address that a human would expect. Cisco was the first to do this and since they are so large anyone that doesn't do this is assumed to have written buggy code. (I worked at a vendor that made a router and, after getting tired of telling customer after customer "it isn't a bug, look at the RFC!" just gave up and implemented it to be "like Cisco" so they didn't have to keep explaining it to customers).
For ping, RFC 792 is pretty clear that the reply should come from the IP address that received the packet. The reason MS might not do that is that you have passed through some kind of NAT, or their alias mechanism is so light weight that the actual IP address the packet was sent to gets thrown away by one layer and by the time it gets to the ICMP (ping) processing there is no other logical thing to do.
If this is causing a problem, ping the other IP address.