I think you can adapt the scheme I propose here (i.e. state lookup-less clients).
Specifically, modify the steps below to deal with general witnesses instead of UTXO-specific inclusion proofs:
TL;DR: Witnesses can be updated by applying only the last D blocks, which removes the need to interactively update them. Since D is bounded, we don’t have to worry about runaway DoS attacks.