I think the problem is the same thing that prevents someone from creating a true function with $puts/$get.
The issue is that strings which are put into variables are only evaluated once, at creation time.
So when you put the $progress() function into a variable, it is only storing the string outputted by $progress, not the actually code itself. Thus, every time you call the variable with $get, you get that exact same string that $progress evaluated when your PROGRESS_BAR variable was created. This means that even though the time elapsed tags are changing, only the very first value is being used each time you call $get.
I'm not 100% sure of this because I don't know how the status bar tagz display is setup internally, but I'm fairly certain this is the cause.
Edit: Just reread your post and what I said must not be the case actually since you were able to get
$puts(progress_bar, $progress(%_time_elapsed_seconds%,%_time_total_seconds%,20,|,'—'))
... to work.
It seems maybe the problem is that with:
$puts(progress_bar,$progress($get(time_secs),20,|,'—'))
... you are only passing 4 parameters to $progress when is expecting 5. I don't think that your comma seperating in creating the time_secs variable is actually being evaluated as two parameters. Try breakign it up into two seperate variables and it should work.