Powering a servo from a Arduino 2560 shield, it works fine if the USB cable is attached to a PC. It doesn't work if the USB cable is not attached and I'm powering the board from a 12 v (9 AH) battery to Vin. I assume this is because of a current limitation difference between the two power modes.
a. Is that correct?
b. What are the limitations?
What battery chemistry? Lead-acid should supply way more current than USB could ever hope to.
However, I can tell you're going through a voltage regulator when you're running off battery (as 12V direct would make things go poof). My guess is your voltage regulator can't handle the current required by the servo (it only works on USB because you're not using the regulator then).
Does the board work if the servo isn't connected? If not, then the on-board regulator is damaged.
Also keep in mind the onboard regulator is only heat sinked to the PCB, which limits how much current it can provide. Often with a 12V input, the regulator can't provide the same amount of current USB can.
The general rule is that an arduino board is great at controlling servos, but piss poor at powering them. So one should always try to run servos with an independent voltage source for the servos (but you must wire the external ground to an arduino ground pin for the control signal to work) and not use the 5v pin (or even the Vin pin with a voltage regulator).