You are correct that MathJax left-justifies all scripts, including pre-scripts, and that the spec doesn't indicate how these should be justified. I will await David Carlisle's update before deciding how to handle the issue in general.
In the meantime, you can use something like
<math>
<mrow>
<mmultiscripts>
<mo> O </mo>
<mprescripts/>
<mn> 18 </mn>
<mrow>
<mphantom><mn> 8 </mn></mphantom>
<mn> 1 </mn>
</mrow>
</mmultiscripts>
</mrow>
</math>
to get the scripts to align the way you want (ugly, but works). Note that the numbers are all the same width (in the MathJax fonts), so you can do this even if the numbers are not the same in both scripts.
An alternative is to use an <mphantom> that contains the wider of the two, and <mpadded> to shift the other one backwards.
<mrow>
<mmultiscripts>
<mo> O </mo>
<mprescripts/>
<mn> 18 </mn>
<mrow>
<mphantom><mn> 18 </mn></mphantom>
<mpadded width="0px" lspace="-1width">
<mn> 1 </mn>
</mpadded>
</mrow>
</mmultiscripts>
</mrow>
</math>
This is the most general way, and doesn't rely on characters being the same width. It is a bit awkward, but it works.
Davide