That's weird. I wonder if there was a bug at some point that caused the demonic status to persist between characters.
I did find the code to check the offspring's demonic status and the game does adhere strictly to the chart in the library. The only thing left to chance is the subspecies if both the mother and father are non-human half-demons, in which case the offspring's subspecies will be randomly selected between the two.
That does lead to something that I missed, however: there is a separate function for generating half-demon bodies. Here's how that one works:
The starting gender distribution is 50/50, with a split between a feminine character with a vagina and breasts and a masculine character with a penis. The player's preferences are used to determine the subspecies' race stage from the player's furry preferences, specifically the feminine preference (the masculine preference does not appear to be taken into account. Another bug, perhaps?). The core body type is set to demon, as expected.
Since demons are still considered a non-human species, at this point the game forces the race stage to be at least "lesser," as the parts that aren't covered by furry bits will always be demonic. From that point, the child's body is prepopulated with all of the default values from the appropriate demonic body type.
At this point, the pregenerated body is used to seed the other generate body function, so many of the measurements and specific traits will be modified and/or appended to. The most important aspect here is that in demonic and human/anthro pairings, the demon's subspecies will always win the genetic lottery, though the specific traits are influenced by both parties.
It's a really weird system, and I think there might be some issues with it. Like, judging from the code, it kind of appears like if the mother is a demon, Lilin, or Elder Lilin and the father is a human, the father's subspecies is the one that gets passed on, yet if the mother is a half-demon and the father is a human the mother's is passed on. I'm going to have to play around with that later just to make sure I'm not misreading or misunderstanding something.
Don't tempt me.