On first example, you print the string s, and console will ignore the \x00. You do a print(s).
On you last line, you get the string from python prompt. If you print it: print(bytes(s,'utf-16').decode('utf-16')), you get what you want.
So Python prompt show you to the variable, with context (e.g. you see also the ' signs), but not the real representation of the string (which do you have with print).
ADDENDUM:
print will print the string in its argument, eventually calling str() to convert the argument to string. But python prompt will print the representation of the variable (given with repr(). So you can print(repr(bytes(s,'utf-16').decode('utf-16'))) to get the same string you get in python interactive session, but as string. Instead of printing, you can assign such function (r = repr(bytes(...).decode(...)), so you have r[0] is ', r[1] is \, etc.
'\x00'to print as a blank.