How to create a "heat distortion" effect with a cycles procedural node set up without compositing
While it's not possible to vary the refraction throughout an object using volumetrics we can mimic the effect by varying the refraction at points on a surface and view the scene through that surface.

The Refraction shader affects the ray at the point of hitting the surface. If the ray hits the front of the surface then it is treated as a transition from air (IOR = 1.0) into the material, while if it hits the back of a surface then it is calculated as exiting the material back into air. Normally the ray would travel through the mesh, entering through one surface (bending one way) and exiting through another (bending the other way), resulting in the material acting like a prism. However, if we use a plane rather than a manifold mesh then only one side of the refraction effect takes place and we can use this to redirect the ray - as if it had passed through a lower density patch of air. 

Refraction is dependent on the angle the ray hits the surface - with zero refraction if it's incident along the Normal and increasing refraction as the angle with the normal increases. We can use the 'Incident' Light Path property to determine the angle of the incoming ray and use this to manipulate the Normal of the surface to get the desired bending of the ray.

To achieve the effect, create a plane and add a new material to it. Open the node editor, remove the default Diffuse shader and replace it with a Refraction shader. Add a Geometry node and link the Incoming node with the Refraction shader Normal. This will mean that the Normal at any point in the shader will always be the same angle as the incident ray and will result in the surface behaving simply as if it were a Transparent shader (as all rays will hit it along the Normal and so no refraction will take place).

Add a Bump node between the Geometry node and the Refraction Shader to affect the distortion and feed this with your heat map as a series of images. Placing the plane between the camera and your scene will now distort the view to simulate heat haze distortion.



Note the addition of a Transparent shader mixed in for Shadow rays to prevent the distortion plane from casting a shadow. Also, ensure the Refraction shader colour is set to pure white.

For the heat map you can either use a Blender smoke simulation saved to a sequence of images or generate simulated smoke using a procedural texture. I used the following crudely generated heat map. This was generated using a Musgrave texture (and some noise), warped so as to taper towards the top, and masked off at the sides. It was animated by simply keyframing the Z-coordinate for the vector of the texture nodes.



This produced the following result : 



See the attached blend files for details.

Heat Haze 

Heat Map