First, transfer out older coins, gathering as few inputs as possible. The client does this automatically, and exchanges will typically have a vast supply of old outputs they can claim.
Second, combine transactions (using 'sendmany'), sending funds to more than one destination at a time. If you have a single, large, old transaction output you can claim, use it to make payments to three or four destinations at once. This will keep your transaction just inside the free relay limit.
Third, configure your client appropriately. Set it to never pay a transaction fee. Set it to specifically connect to other clients known to relay transactions with no fees and known to be linked to miners who are willing to include transactions with no fees. And trade off anonymity for convenience and speed by modifying your client to send new, local transactions to all connected clients immediately.
Note that not all of these strategies will always be appropriate. For example, if fast transactions are important to your customers, it may be worth paying the occasional transaction fee even if you have to eat the cost.