Simple confusion with DATALENGTH()
The 'DATALENGTH()' function returns the length of just the data, those extra two bytes are considered "meta-data" - information about the data and/or its storage.

You get the same value if you pass the function a string literal (DATALENGTH('12345') returns 5) - this wouldn't be the case if the function accounted for storage overheads as well as the string's content.

To account for storage overhead the DATALENGTH function would need to know or be able to derive where a value has come from, and the structure of that location, if the data is compressed, etc., and accounting for all that would make the function far less efficient.