Which device are you using?

I compiled two different version and looked at the .lst and with my limited understanding of assembly I'd say it "should work"

First, HSEROUT [STR Buffer\16]
Code:
         movlw   low (010h)
         movwf   R4 + 1
         movlw   low (low (HSEROUTJ))
         movwf   R8
         clrf    (R8) + 1
         clrf    R2 + 1
         movlw   low (low (_Buffer))
         call    SEROUT2STRN
Here it takes the literal 16 and moves it to the low byte (I think) of system variable R4.

Second, HSEROUT [STR Buffer\Length]
Code:
         movf    _Length, W
         movwf   R4 + 1
         movlw   low (low (HSEROUTJ))
         movwf   R8
         clrf    (R8) + 1
         clrf    R2 + 1
         movlw   low (low (_Buffer))
         call    SEROUT2STRN
Here it takes the Length variable, and loads THAT to the low byte (I think) of system variable R4.

In the actual serout macro it then decrements R4 to determine when it's done.