This is not a complete solution, but an approach: What about using a "role playing fact table": You would have two copies of the fact table, named, say "Sent" and "Received". Both would reference the same dimension "Customer" (from the Received fact table, as the receiver, and from the Sent fact table as the sender). The other party (the sender for the Received fact and the receiver from the Sent fact) would reference the customer table as well, this time with a role playing dimension.
Technically, you could implement this via views or named queries in the DSV, as the BIDS GUI does not allow to use one fact table for two measure groups.
The advantage would be that you do not need any calculated measures for your query, which are probably the main reason for the bad performance.