Well.. that certainly is a creative approach. I guess you did do some
reading ehh..;o]

Initialize your stringsize variable before you start incrementing it.

Move the PUSH up to the entry point of the section "before" modifying
TOS.

See how this works.
Code:
DEFINE LOADER_USED 1
DEFINE OSC 40               ' change to suit oscillator speed
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 19200      ' change to suit baud rate

message var byte[40]
stringsize var byte
stringsize = 0      ; <-- initialize to zero here. Don't wanna incf if it's not
x var byte          ; starting at zero
temp var byte
Clr

Main:
    Call getSTR
@ data "This is a string",0
    Gosub putSTR

    Call getSTR
@ data "yet another string again",0
    Gosub putSTR
Done:
   Goto Done

putSTR:
    For x = 0 To (stringsize-1)
    temp = message[x]
    Hserout [temp]
    Next x
    Hserout [$0D,$0A]       ; send carriage return + line feed
    stringsize = 0          ; reset for next message
    Return    

asm
_getSTR
    LFSR    FSR0,_message   ; set message array base address

;copy return address to TBLPTR and then pop it off the stack
    movf    TOSU,W
    movwf   TBLPTRU
    movf    TOSH,W
    movwf   TBLPTRH
    movf    TOSL,W
    movwf   TBLPTRL
    POP

;TBLPTR should now be pointing to 1st character in string
Next_Char
    tblrd   *+              ; table read and post increment TBLPTR
    movf    TABLAT,W        ; retrieve character to W register
    movwf   POSTINC0        ; xfer to message array and increment FSR
    incf    _stringsize,F   ; keep track of message string size
    movf    TABLAT,W        ; Is character = 0?
    bnz     Next_Char       ; If not, then get next character			

;use incremented value of TBLPTR as new return address (push it)
    PUSH ; <--- moved up to here
    movf   TBLPTRU,W
    movwf   TOSU
    movf   TBLPTRH,W
    movwf   TOSH
    movf   TBLPTRL,W
    movwf   TOSL
    ; PUSH
    return                  ;finished with message, return to caller
endasm