entities = <|"Gilgamesh" -> <|"happiness" -> 3|>|>;
rules = {<|"entity" -> "Gilgamesh", "property" -> "happiness",
"rule" -> (If[# > 0, # - 1, #] &)|>};
NestWhileList[
Fold[ReplacePart[#, {#2@"entity", #2@"property"} -> #2[
"rule"]@#[#2@"entity"][#2@"property"]] &, #,
rules] &, entities, #["Gilgamesh", "happiness"] > 0 &]