According to your description, the performance is much better when execute queries separately for each level of product hierarchy than that using
"UNION(ASCENDANTS([Product].[Product Hierarchy].[Product].&),ASCENDANTS([Product].[Product Hierarchy].[Product].&))".
As per my understanding, the issue can be related to CrossJoin function. When using this query, you need calculated the all of the ancestors of a member from the member and then union two sets under CrossJoin function.
Microsoft is conducting an online survey to understand your opinion of the Technet Web site. If you choose to participate, the online survey will be presented to you when you leave the Technet Web site.