The primary problem is that you are calling ReduceMeter() in Update. Each time you call ReduceMeter() it creates a new coroutine that is then yielded. If you app was running at 60 fps, you would stack up 120 coroutimes before the first one fires, then one (or more) would approximately fire every frame for the rest of the game.
I’m having a hard time figuring out from the code you have here under what conditions the meter should be reduces, so I don’t know how to recommend a fix. You could:
Remove the yield and start an Invoke() repeating in Start().
Call ReduceMeter once and then execute the code inside in a forever loop (while(true)) inside ReduceMeter.
Use a time or timestamp.
My guess is that you want the last one. Something like this (untested):