"Brute Strength" Approach
Knowing that any coordinate in local space can be converted to global space using the object's matrix world. Can get the local coordinate of the end of the normal by using it against the local origin (0, 0, 0) where adding normal is also its local coordinate. Converting each end to global and subtracting will produce desired direction vector in global space.
It is normalized to have length 1 in global space.
mw = ob.matrix_world
# v is some vertex
global_norm = (mw @ v.normal - mw @ Vector()).normalized()
mw * Vector() is the global location of mesh origin, which is also
My linear algebra is a bit rusty, re a proof, , from experience its often the case that multiplying the mw by the local normal (
mw @ v.normal) doesn't always produce the same result if the global origin is not local origin.
PS updated for 2.8 to use
@ for matrix vector multiplication.