Even if EventStore cannot do it, the only important thing is that a replayCallback must be called with logically deleted messages but not with physically deleted messages. It is then up to the journal plugin implementation to use two different deletion markers (logical, physical) and if a physical deletion marker for a message is encountered, the replayCallback is not called for that message. 

Even for LevelDB, a physical deletion is not done immediately but instead uses a LevelDB-internal deletion marker. The physical deletion comes with the next compaction. Something similar can be done in EventStore with deleting all events up to event X (where all events prior to X have a physical deletion marker). This is not really a compaction but also a delayed deletion.