Did you check the input to the PIC as well as the output?
It's the input that is mainly effected by the level shifting i.e. RX pin.
If you have turned on "echo" but have only 1 'a' displayed, and printf etc works fine (test, before the while(1) loop add a "printf("Testing RS232\r\r");"), then there is something iffy with your transmit to PIC receive circuitry.
Hyperterminal itself is simple, it's a "dumb terminal".
Unless there is something majorly wrong with your code, then it isn't a coding issue.
It will be more likely a timing / hardware issue, which is why I suggest using Terraterm Pro or Moxa Datascope utility instead of Hyperterminal, or something that can display the HEX representation of what is comming out of the MAX232 circuitry.
At this stage, it's all about debugging!
One thing you could do, is connect RX to TX on the 232 circuit (TTL side), temporarily. bypass the PIC, and check that the characters are echoed back through hardware.
Can you isolate power to the pic from the 232 converter? Might be a useful exercise.
With the HEX representation idea, you send a uppercase A for example which is ASCII 65, HEX 41, you should see RXing a code 41, if you see something like FE, FF, 00, C1 etc, that means there is data corruption, and the levels are not shifting correctly.
If you see nothing at all, there is a major issue with either the PIC or the 232, in which case, conduct the loopback test (TX to RX on TTL side of the 232 circuit), eliminate the issues / potential issues 1 by 1!
Good luck, i'm sure you will be able to find the problem.
Wilksey