I've managed to come up with a script that does actually work, but I have to run it after rotation of the head bone.
So, I was hoping someone could help me figure out how to make it constantly update - I'm thinking that I can probably use a script controller and the dependsOn command to make each neck joints rotation depend on the head. Ideally I'll end up with an interface that will allow myself or the animators to turn it on or off at will, as there may be occasions when I won't want the head to control the neck.
Anyway, this is the working code that I have.
-- Set up variables to store the rotatation data from the bones via the Expose Transforms
herx = $'etm_Head'.baseObject[#Local_Euler_X].value
hery = $'etm_Head'.baseObject[#Local_Euler_Y].value
herz = $'etm_Head'.baseObject[#Local_Euler_Z].value
-- calculate the angles I need to apply, for some reason the biped
-- neck xyz is inverted to zyx
rot_nl = eulerangles (herz*.33) (-hery*.33) (herx*.33)
rot_nu = eulerangles (herz*.33) (-hery*.33) (herx*.33)
-- perform the rotation
rotate $'Char NeckL' rot_nl
rotate $'Char NeckU' rot_nu