I regularly use an XBee S2 connected directly to an arduino without special circuitry to try out ideas. The pins are 5V tolerant except for power, which you are getting from the 3.3V so that should be fine. I don't run them long term this way (weeks), but I have one device that has been set up this way for months. Net, I don't think the additional circuitry to do level conversions is necessary at the beginning stages, but will be over time.
What you seem to be getting is a baud rate difference. Double check the XBee on the arduino to be sure the baud rate is set to 9600 just to be sure something didn't sneak in and change it while you weren't looking. Note that the XBee on the Arduino and the XBee on the PC don't have to be the same baud rate, they have to match the device they're attached to. So, if the terminal emulator or XCTU or whatever on the PC is using a different baud rate, check that XBee to be sure it is correct.
Next, you mentioned that you were trying to do a project using API mode. The code you're using on the arduino will only show good stuff if you're using transparent mode. API mode will be wrapped up in headers, checksums, addresses and such and will appear to printing garbage out the serial port. So, make sure (for now at least) that you are not using API mode. As for the fact that you see the led change, a bunch of seemingly garbage characters may well have an a or b in there somewhere; this may just be an accident.
When you get it talking such that you recognize the characters, take a look at the XBee library to help you decode the API packets; this will save you some trouble and headaches when you get further into the project.