The events written as the write model are themselves also a read model. There's therefore not necessarily any problem with querying those events for all events up to some point in time and, to use the FP term, folding over them to derive the state at a point in time.
If one doesn't want to query the same datastore as used for processing commands, the most trivial projection is one to essentially create a replica of the event store for querying:
- for each event, write that event to a database (perhaps enriching with timestamp, entity ID, tag, etc. columns)
This query over the persisted events (whether you query the write-side's event store or some replica of the event store for querying) can be the basis for any read model: read models with their own databases are just an optimization so repeated queries aren't always replaying the events and applying the same function in the fold.