I think your after-change-function is called not due to
insert-file-contents inserting the text from the file, but from the
functions that decode the file's text.  To see if this is true, make
your after-change-function show the name of the current buffer.  If
I'm right, you will see something like " *code conversion works" as
the name of the buffer, in which case indeed buffer-filename is
expected to be nil, and I don't see a bug here.

 I have suspected the same as the only call to set a buffer's name to nil is found in the implementation of insert-file-contents near the code conversion buffer, but that's a red herring. As you can see from my report, the after-change-function does contain a call to (current-buffer), and the message prints out the file buffer's name correctly.

Curiously, if you save the file between step 4 and 5 from my reproduction instruction, the buffer-file-name is printed correctly.

Hope this helps.