There is no complete program you can write in CBPV that you couldn't have written in CBV.

The difference is in what you can *abstract over*. In CBV you can only abstract over the "value types" whereas CBPV gives you a new sort you can abstract over: computation types. So you can't write programs in CBPV you couldn't write in CBV but you can write *libraries* that have no direct analogue.

So the difference as a programming language only starts to appear when you start doing higher-order constructions like recursive types and quantified types. In my group we are exploring this space with our language Zydeco (https://github.com/zydeco-lang/zydeco). One of these new abstractions we have in CBPV+forall is relative monads which we study in our recent PACMPL/OOPSLA paper (https://dl.acm.org/doi/10.1145/3720434).

GitHub - zydeco-lang/zydeco: a proof-of-concept programming language based on call-by-push-value

a proof-of-concept programming language based on call-by-push-value - zydeco-lang/zydeco

GitHub
In meta theory on the other hand, the distinction is already useful even if you are studying simply typed languages because at the meta-level you can abstract over the computation types even if you can't inside the language.