One more cut at the NPC

I like Morale; it can stay.
I like something in the same vein as Loyalty, but maybe not Loyalty itself.
The whole way I was doing the bond thing is… Working. Clumsy. Let’s try that part again. We’ll just stick it into Loyalty.

We don’t actually need granular bonds. I mean, we need freeform descriptors to create texture for our NPCs, obviously, but we don’t need them to double up as a progress track.

We also don’t need a sliding scale of more- and less- friendly that it implied, not as a piece of general tech.

Using Morale:
Check Morale for each follower upon the first seen death each short rest, and the first time it is bloodied each short rest. The DC for this saving throw is 10.
When an NPC fails a Morale check, it gains the Frightened condition with respect to the cause of the check: the enemy who caused the death or damage.
Indifferent NPCs also check upon rolling for initiative.
Hostile NPCs also make this save with disadvantage.

That’s more or less all that causes Morale checks; additionally saves against fear effects may substitute Morale for the specified statistic.

Remember that you calculate Morale as the better of Wis or Con.

Using Loyalty:
Loyalty are a way of tracking dedication. The default mechanism in the DMG (page 93) is a little heavyweight and requires that I remember things, gross.
As with all hidden data schemes, we can substitute randomness. Staunch allies use a d12; shaky ones use a d4, and Indifferent all the dice between.
Loyalty can be tested, or improved.
Testing Loyalty happens when the party acts counter to Bonds or other traits of the NPC, shrinking the die on a 1-3 — shrinking it two steps on a 1 if the test was egregious!
Roll the test each time the party acts counter to the Bonds.
Improving Loyalty happens when the NPC is treated particularly well — given gifts, etc — using the same mechanism as acquiring the follower. If the resultant die is larger than the current one, the die grows one size.
DC <0: d4 and hostility and betrayal.
DC 0: d4
DC 5: d6
DC 10: d8
DC 15: d10
DC 20: d12
DC 40: d20
The party knows when they've been bad or good; they know the size of the die most of the time. The DM updates the party on the status of the NPC during long rests or other times they might settle up the hidden properties of magic items etc. Because we decrease Loyalty with a die roll, the party knows they're in danger but aren't sure just how much.

You could use the same mechanism for Morale!
Start with the creature's hit die, adjust 1-2 sizes by wisdom modifier (Con correlates pretty strongly with size). Check Morale in the conditions above, failing on a 1-3.

Finally, Insight. It's just a skill. But players totally lie to their NPCs all the time.