How do we "exchange coins on one blockchain for those on the other"?
There are two ways to avoid transaction replay (besides something being built into the fork to begin with). You can taint your coins or double spend.

Tainting your coins requires you to get access to coins created after the fork on at least one of the chains. If you create a transaction which includes an input from a coinbase transaction created on the BIP 148 chain, then that transaction is invalid on the non-BIP 148 chain. And vice versa. Then any transaction which spends from this tainting transaction will only be valid on one chain.

The other way is to perform a double spend. Let's assume that the BIP 148 chain has less hashrate (and thus slower blocks). You make a transaction which signals for RBF which is likely to confirm in the next block on the non-BIP 148 chain. Since the non-BIP 148 chain produces blocks more quickly, your transaction will likely confirm on the non-BIP 148 chain before it does on the BIP 148 chain. Once you have a confirmation on the non-BIP 148 chain, create a double spend which pays a higher fee (to take advantage of RBF) and sends the coins to a different address. This transaction will then confirm on the BIP 148 chain since it is invalid on the non-BIP 148 chain and has replaced the original. Your coins are now separate and won't be at risk for transaction replay.