I've attached an example I threw together of how I might do something like this in LabVIEW without needing a global variable. I guess technically I'm not using any subVIs, but I could easily move the (convert to string, write string to display) blocks into an independent subVI and pass in the value of the shift register. I think this example maintains the spirit of your challenge. Hopefully the comments I've included make things pretty clear.
One note: to create a shift register, wire a value across a loop boundary, right-click on the tunnel (colored square) that gets created, and select "Replace with Shift Register." Let me know if you have any questions.
------
James Blair
NI R&D