I could imagine, that different passages of your story need different words depending on the choice.
If you do not want to have a seperate passage used as a kind of dictionary, it might be possible to define exactly those words in the certain passages, which are really needed.
In that case, the choice setter routine would not set the word(s) itself, but more in general the choosen gender ($love_interest). Each passage then defines the required variables/words with `(if: )`. The Start passage itself needs a 'him' or 'her', so $him_her is set within the choice setter.
Start itself needs 'him' or 'her' for the introductory sentence
Are you interested in\
(link: "boys")[(set: $love_interest to "male")
(set: $her_him to "him")
(show: ?LetTheStoryBegin)] \
(link: "girls")[(set: $love_interest to "female")
(set: $her_him to "her")
|LetTheStoryBegin)[Let the story begin to find $her_him ...
You have a [[StoryDate<-date]].
Your mobile [[rings->StoryPhoneCall]].
StoryDate needs 'boy'/'girl' and 'She/He':
(if: $love_interest is "male")[(set: $Person to "boy", $Pronoun to "He")]
(if: $love_interest is "female")[(set: $Person to "girl", $Pronoun to "She")]
The $Person, you are looking for, is in front of you.
$Pronoun is smiling at you.
StoryPhoneCall needs a name for the calling person and 'her'/'him'.
(if: $love_interest is "male")[(set: $Person to "Pete", $pronoun to "him")]
(if: $love_interest is "female")[(set: $Person to "Susy", $pronoun to "her")]
It's $Person on the phone. You wonder, if you would like $pronoun ...
I have issues with handling temp variables, so I used global ones here overall.
The 'show: hidden_hook' thing might be a bit off topic to this question, but may prevent the story player from stumbling into situations which he/she was not prepared for ... :-)