The timestamp isn’t exactly the reason a receiver of a unidirectional payment channel is incentivized to claim the latest state but you’re on the right track. It’s because the latest state contains the highest value of token transfer. You could remove the timestamp from your state and have your contract check…
assert(msg.amount > balance[msg.sender]);
This way you wouldn’t have to reset the off-chain balance or have to witness exits either. Always track a total balance issued and have the parent contract only send the difference of the latest withdrawal recorded and the current state provided. Think that should work