I am also a fan of foreshadowing.
What I would suggest is to, as you said, have a set in stone event that will happen and let that be what you foreshadow. Just because an event itself is set in stone to happen in the game, doesn't mean that it has to be unforgivably linear. Personally I would just use variables and $pagescript or %%variable%=%Number%Text%% to allow the page or pages of the foreshadowed part of the story to change based on player decision just enough that it feels interaction is non linear even though that event happens regardless of what the player chooses. The only thing that needs to remain constant is what was foreshadowed. Everything else can be as varying as you make it.
It really depends on just what you want to achieve with this story game. Scripting can remedy that linear feeling of a set in stone event and the player's choices during that event can potentially then branch out as much or as little as you are willing to allow from that point. So while as a writer yes that part of your story game will feel linear, the reader can potentially never even notice that that is the case.
All it takes is a few paragraphs on the page changing based on past player choices. For example:
Maybe Cynthia and Charles had an argument earlier and that affects Cynthia's overall reaction and emotion during the event, giving her thoughts and dialogue an angrier tone, or maybe the player chose to be friendly toward Charles, so when Cynthia then witnesses him going psycho she feels an inner conflict toward him or is more sad and betrayed than angry. The event itself stays the same, but the way the player character interacts with the event changes based on player choice.