It's not a perfect solution, but it's often enough. When portlets are in different wars, a homegrown solution must be used. With IRAD/WebSphere, you can use C2A (Click-2-Action) or PortletServices. Other times a shared database table might be needed.
The pattern is: You make an ajax call from one portlet and provide this portlet with id in another portlet. When you have an answer from the ajax call you update the div with the information you got.
It would be convenient to route the calls through a container object. Whenever, a portlet is added or removed, it needs to register/un-register itself to the container. The container would refer to the portlet through it's id and the reference to the DIV element.
Session variables sharing
Another way is to store variables in the session and make them sharable for portlets. This way you can put stuff into session and display different things based on the information in the session.
Use Liferay portlet url tag
Proprietary portlet url tag that allows you to target one portlet to another (cross-linking).