One method is to create a volumetric cylinder and distort it by rotating it around the origin by an amount that varies based on the distance from the origin.

First, create a volumetric cylinder. This is achieved by calculating the distance from the origin in just two of the three dimensions (it's effectively a circle projected along the remaining axis). This can be achieved using the Dot Product vector maths node using the following arrangement (assuming the cylinder is to be produced along the 'y' axis) :

[![volumetric cylinder][1]][1]

The Dot Product used in this way (with the same vector on both inputs) produces the square of the length of the vector. The following Power(0.5) node calculates the square root of the squared length - ie, the actual vector length. The Less Than node controls the radius of the cylinder.

NOTE : The Geometry Volume Sampling step size has been decreased to 0.010 in this example in order to improve the volumetric precision (at the expense of render time). Also, the Light Paths Volume Bounces has been increased from zero to 3 to allow multiple scatter bounces (see the properties panel at the right-hand side of the image).

In order to rotate the cylinder we need to use a rotation matrix similar to 

    X = x * cos(angle) + y * sin(angle)
    Y = -x * sin(angle) + y * cos(angle)

Since we already know that the 'y' coordinate is irrelevant (since the cylinder is unchanged regardless of where along the y-axis it is viewed) we can simplify this by only actually needing to calculate in the X coordinate. This is therefore achieved with the following additional nodes :

[![rotated volumetric cylinder][2]][2]

NOTE : Varying the Value input node rotates the volumetric cylinder. The Multiply node multiplies the input value by 2*pi, converting the input value to radians - so 0.0 to 1.0 produces one whole rotation.

To produce a spiral we can simply vary the rotation based on the distance from the origin. This can be achieved with another Dot Product/Power node combination with the following additional nodes :

[![spiral (but flattened)][3]][3]

Increasing the Value input varies the number of turns of the spiral.

Note, however, that the spiral is stretched into a thin ribbon as it is rotated. To counteract this we can simply add additional nodes to vary the thickness of the original "cylinder" based on the distance from the origin :

[![spiral][4]][4]

Blend file included [<img src="https://blend-exchange.giantcowfilms.com/embedImage.png?bid=4837" />](https://blend-exchange.giantcowfilms.com/b/4837/)

Note that this is a very much "brute force" method of generating a spiral - and it can only produce a spiral with two "arms" (unless you were to truncate the spiral at `y = 0` - in which case it would have a single "arm"). There is a better (more mathematical) method - which I'll add in due course.

  [1]: https://i.sstatic.net/BgWlv.png
  [2]: https://i.sstatic.net/149Pu.png
  [3]: https://i.sstatic.net/OvLTc.png
  [4]: https://i.sstatic.net/IVc0U.png