Why RTS/CTS do not solve completely the hidden terminal problem and exposed terminal problem?
First of all, it should be noted that RTS/CTS referred to in the question have nothing to do with hardware wires such as the RTS/CTS wires frequently used for UART handshaking.  That having been said, this is a low-level radio-communication problem and would appear to be about as topical here as would be questions about things like XBee.

The "hidden/exposed" terminal problem relates the fact that it's possible to have three nodes, X, Y, and Z, such that Y is close enough to X to receive data when Z is silent, and Z is simultaneously close enough to Y to jam communications from X, but far enough away from X that X cannot detect it.

In the general case, Z will have no way of knowing when someone might be sending information to Y, and thus Z will have no way of knowing when his transmissions would jam those of someone else.  If X is sending a small packet to Y, it's cheaper for X to simply send it and be prepared to retransmit if it gets jammed, than it would be to try to prevent such jamming.  If X is sending a larger packet, however, it's useful to have X start with a small packet that tells Y to expect a larger one, and have Y respond with a small packet that indicates that it's expecting to receive the larger packet.  This has a few useful effects.  Chief among them:


If Y cannot hear a small packet from X, there's no reason for X to send a big packet.  Having X refrain from sending a big packet helps avoid cluttering up the airwaves with useless data that would possibly block or collide with other transmissions.
If Z hears Y say that it's expecting data from X, then Z will know that it should avoid transmitting on that particular channel during the time the transmission is expected to take place.


The RTS/CTS protocol is not a panacea.  It can make it so that collisions are unlikely on larger data blocks, but does nothing to solve the problem of collisions with smaller data blocks [fortunately, small-block collisions are generally less costly].  Further, even if both X and Y advertise the fact that X is going to send data to Y, and even if Z is close enough to X and Y to jam their transmissions, there's no guarantee that Z will actually hear the advertisement from X or Y.  For example, Z might be communicating with node Q, which is out of range of X and Y, and Q might send data to Z at the same time as X and Y are sending their advertisements.  In that case, because Z would not have heard X and Y saying they expected to talk to each other, Z would have no reason to hold off its transmissions on their behalf.

Fundamentally, wireless communication is plagued with a certain asymmetry: if A hears something from B, it can know that B sent it, but if A doesn't hear anything that doesn't imply that that B didn't send anything.  Conceptually, it should be possible for a receiver to distinguish between "silence" and "indecipherable noise", and figure that if A gets silence (as opposed to noise) then B can't have sent anything, but I am unaware of protocols that take advantage of such distinctions.