Think as follows.
One possibility is that there is no y. Then [a-xz]* matches it, with [a-wyz]* matching an empty string.
Another possibility is that there is no x. Then [a-wyz]* matches the whole string, with [a-xz]* matching an empty string.
Finally, the string might contain both an x and a y. Then [a-xz]* matches the part up to the first y and [a-wyz]* matches the rest.
Note that it is not possible to match a string that has an x after a y. The only way to match a y is to use [a-wyz]*. But then you can never get another x.