Would it be ok to have events in the event stream that does not effect any aggregate in the domain state?
Take for instance an event such as AllCompletedTodosPurged that
By not affecting the aggregate, I'm assuming you mean private variables inside the aggregate class itself? If you meant something else, ignore this answer.
I find that developers who are implementing ES for the first time tend to struggle with this question. The first time I did an end-to-end reference implementation, I had the exact same question.
I was actually surprised to find that local aggregate state was not as useful as I thought it would be--that state was almost always more naturally expressed in the form of projected read models. The only time you really need local state is when it is required to process an individual event (e.g. for validation).
So I would say it's not only acceptable to support events that don't change local aggregate state, these types of events are arguably more common than events that do change local state.