One of the maintainers of zstd here, AMA
zstd --patch-from=old new -c | zstd -d --patch-from=old
Using the library this can be achieved by using the old file as a dictionary. If you have very large files (MB-GB range) you will also want to enable long range mode, otherwise zstd might not be able to find the repetition. --patch-from on the CLI will manage this automatically.
The release notes from zstd-1.4.5 [0] contain some details about the speed/size tradeoff of "patch-from" mode, compared to other delta engines. There is also a wiki page detailing how to use zstd as a delta engine [1].
[0] https://github.com/facebook/zstd/releases/tag/v1.4.5
[1] https://github.com/facebook/zstd/wiki/Zstandard-as-a-patchin...