If you want to convert more than a few thousand dollars, one somewhat complex method is to have two investment accounts at a discount broker that operations both in Canada and the USA, then buy securities for USD on a US exchange, have your broker move them to the Canadian account, then sell them on a Canadian exchange for CAD.
This will, of course, incur trading fees, but they should be lower than most currency conversion fees if you convert more than a few thousand dollars, because trading fees typically have a very small percentage component.
Using a currency ETF as the security to buy/sell can eliminate the market risk.
In any case, it may take up to a week for the trades and transfer to settle.