I'm a n00b, and these might be really stupid suggestions. Tell me so, please, because I'd like to learn why these wouldn't work.
(Also, Java is not my native programming language, so forgive my logo-ish pseudo-code.)
1.a. You wouldn't have to check every inventory at every tick. You only need to check when you open that inventory.
You'd need to keep track of what tick the inventory was last opened at and subtract it from the current tick to figure out how likely the food inside is to be rotten. You could also choose whether or not to run the more specific "is it rotten?" check at all, based on how long it's been.
1.b. Even more specifically (and may be overkill/over complication), you don't have to add an inventory to the list of "needs food-rot-checking" if you don't put any food in a particular chest. When you add food to a chest, add the chest to the list; when you open a chest, check it against that list. When you close the chest, check if it should still be on that list (which should return false if there is no fresh food).
2. Each food item doesn't need to keep track of its own ticks. Just give it a probability to run for each tick (or bunch of ticks) since the last time it was checked.
ie:
set (days_variable) ((time since last check) / 24000)
if days_variable >= 1 (
repeat * (days_variable) (
if random 100 < 33 (set food_freshness (rotten))
))
3. Whittling down the things you need to check even more, you only need to check if food has gone rotten if its last known state was fresh. You probably don't need to go so far as making this it's own sub-list, but maybe you do.
(Thanks, Schrodinger.)