According to The TeXbook, the rule for end-of-lines is as follows
If TeX sees an end-of-line character (category 5), it throws away
any other information that might remain on the current line. Then if
TeX is in state N (new line), the end-of-line character is
converted to the control sequence token \par (end of
paragraph); if TeX is in state M (mid-line), the end-of-line
character is converted to a token for character 32 ( ) of
category 10 (space); and if TeX is in state S (skipping
blanks), the end-of-line character is simply dropped.
Here, it's important to note that the TeX inserts the \par token, and not the \par primitive. That means that \par has to be defined under all circumstances. Knuth illustrates this point when discussing commands which force horizontal mode:
The appearance of a <vertical command> in restricted horizontal mode
is forbidden, but in regular horizontal mode it causes TeX to insert
the token \par into the input; after reading and expanding this
\par token, TeX will see the <vertical command> token again.
(The current meaning of the control sequence \par will be used;
\par might no longer stand for TeX's \par primitive.)
Now, what does not seem to be mentioned anywhere is what happens at the end of internal vertical mode. Clearly, the rules above do not allow for the insertion of a \par token as there are no end-of-line markers to deal with. (You do get a \par inserted if there is a blank line between the last material in the \vbox and the end of the box.)
Reading the trace output, there is no mention of the \par primitive at the end of the box, but the shipout does show
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
and of course there is clearly a paragraph built. So my conclusion is that the end of internal vertical mode implicitly inserts a \par primitive, and thus inserts the usual end-of-paragraph material and then runs the paragraph builder.