Hari,
It seems you are already thinking along the "correct" lines with your final suggestion.
There is not requirement that something that is "deleted" must be removed from a model immediately.
For example, when you delete an entity from the datastore, it isn't deleted. It is marked as "deleted" and occassionally the datastore tablets are compacted and all entites marked "deleted" get removed.
What seems to be in-elegant, is really used all over the place in computer science. When something get's deleted.. either a "delete flag" is turned on.. or there is just a pointer to that thing that gets set to Null or something or other.
See here for Nick Johnson's description of Log Structured storage:
For more wonky underneaths of distributed filesystems, see Matt Dillon's description of Hammer ("Data is not (never!) immediately overwritten so no UNDO is needed for file data."):
Also, there is an added benefit of not immediately deleting an entity.. what if someone is on a roll, and they're deleting questions left and right... and then they realize that they deleted five questions that shouldn't have been deleted? If you've been furiously ensuring all deletes with transactions, there is nothing they can do. If you are simply marking items as deleted, you can simply provide them with an un-delete option.
So.. I may start to sound like a broken record (since I feel like I say this in every other post)... but do not use transactions and entity groups unless it is absolutely necessary (you have gone made and are creating a banking subsytem on Appengine, for example).
Most of the time, people just get hung up thinking that a delete or some other event should happen immediately at the moment it was conceived (I blame twitter and txting and chat for this).. and if it doesn't, there is something wrong with the design.
So, long story short, consider doing something like the "IS_DELETED" flag.. (or, if more than one Exam can share the same question, just have Exams point to Pages which point to Questions.. and IS_DELETED is only marked if an entity is no longer pointed to by anything.. and your nightly delete process verifies that IS_DELETED is correct by checking if an entity belongs to something else before delete [that might be a little much])