Edit: The answer turns out to be a combination of 3 and 5 below. (5 was added in this edit.) As made plain by excellent conversation with @scurest, Blender does not orthonormalize its tangent space, and we shouldn't expect unit vectors out of its normal map bakes. They are often very close to unit vectors; it depends on the rate of change of the normal across the face. Blender's treatment of this is not by-the-book, and creates problems for which I've submitted a bug report, but it is not unique either (I tested on xnormal, and it doesn't use orthonormal tangent space either; I've posted some questions regarding how other software handles it, but have no replies as of yet, and it's esoteric enough that basic internet research isn't any use.)
Let's try it out. We'll bake a simple normal map, from a cube to an enclosing UV sphere, and see what our normals look like:
To a reasonable precision, it looks good. None of my normals are shorter than 0.99 and none of them are longer than 1.01. We shouldn't expect much more precision from 8 bit-per-channel color than that.
This image was generated with a single sample bake, but repeating the bake with 64 samples shows no difference.
So what am I doing different from you? I can't say, because I don't have access to all of the details of your bake or your analysis material. Here are some potential differences:
You weren't doing a selected to active bake, but instead baking from normals on a single object, which themselves weren't normalized.
You weren't baking and reading your normal map as non-color data.
You weren't remapping your normal map from the 0,1 range (which is necessary for almost all image formats) to the -1,1 range (which is the space necessary to represent the full range of normalized vectors.)
You were using texture filtering, by using "Linear" instead of "Closest" in your image texture node, which means that the actual color you were reading from the normal map wasn't a single texel, but was instead a box-blurred combination of several texels.
You're using different meshes, and something about the meshes I chose happens to minimize the issue.