I dont think you shouyld use the play command like that. From what I know about it, once its playing no other play command can work untill its finished .
//timer.#hottubmessage 20 1800 msg #hottub $!read(hottubmessage.txt,nt,$calc(20 - $!timer($ctimer).reps)) $(|,) if (!$timer($ctimer).reps) $!+(timer,$ctimer) 20 1 $!timer($ctimer).com
^
that loops the 20 lines then relaunches the timer
//timer.#hottubmessage 20000 1800 msg #hottub $!read(hottubmessage.txt,nt,$calc(20 - $!timer($ctimer).reps % 20))
^
that just uses 20,000 iterations of the timer and keeps playing the file line 1 to 20, 1 to 20, 1 to 20 etc etc, so it does 1000 times through the file