That is the expected behavior. The client function that is triggered is no longer running and hence the lock is not held.
You can design around this behavior in a couple of ways I suppose
1. Separate Message for Completion/Failure
Instead of holding the message lock, you can complete it and once the orchestration completes, push a message to mark the completion (or failure).
2. Message Deferral
While this feature may not have been designed for this use case, you could leverage this to your cause.
The client function would start a new instance of the orchestrator, passing the sequence number of the message so that it can be retrieved later (by another activity function at the end or on failure) and defer the message so that it won't be processed again.