Is it possible to change the IOR inside a volume?
I'm working on a project faking the atmospheric disturbances that bother anyone using a telescope.  This is the sort of distortion that adaptive optics systems compensate for.  It is not much different from heat haze.    

I accomplished this with a plane placed between the camera and a "far away" starry image on another plane.  I gave the plane a Refraction shader (using Cycles), a small IOR maybe 1.02 or something like that, and a Noise or Wave texture and a Bump node to supply a normal vector to the shader.  I animated this by adding a linear increasing value to the x coordinate of the vector given to the texture. The normal vectors have to be kept close to the usual perpendicular direction - just small wobbles.  At least for my setup.

There are actually four of these wobbled-normal planes.  Two have normals up, and the other two have normals down.  Not sure that's necessary, but I figured it would help make things messier.  The texture animations and texture scales are all different, with all roughly a tenth of a wavelength to one wavelength spanning the view.

The bottom layer is an astronomical image - but for a hot desert scene, it could be distant mountains roads and buildings. (There's another layer just above it for another special effect unrelated to this question.)

I have not tried modulating the IOR value of the Refraction node. If the IOR were to vary spatially or with time, the effect would be similar to varying the amount of wobble of the normal vectors.  Either way, I expect rendering to go much faster than any attempt to do volume interactions of any kind.

In my case, the wobbling-normal planes are sized to be larger than the camera's field of view.  In case only part of the scene needs the effect, a mask image could be used to switch between the wobbling-normal Refraction shader, and a plain Transparent one.