Rechargeable batteries have a limit on their service life. After a certain amount of discharge/charge cycles, or over a period of time, they will eventually lose capacity. If you're not using fresh batteries to compare to the runtime you got when everything was brand new, it's not going to be a fair comparison.
Charging in the scanner is a big no-no if you want to get the most out of your batteries, and protect your $500 investment. The in-scanner charging circuit is dumb, it has no idea what the charge status of the individual batteries are, it just pumps voltage into them all at once for as long as the charge time is set in the scanner's menu. If you have that set too high, and the batteries are already fully charged, you're going to fry them. You could also damage the scanner if the batteries overheat or worse. Do yourself a big favor and never charge them inside the scanner, unless it's an emergency. Set the charge time to 1 hour (the lowest it can be set to) and move the switch over to Alkaline so it won't charge them at all.
Now, all of that being said, there are a few things that affect runtime. In a somewhat particular order:
- How busy the systems you are listening to are. More activity = less runtime
- How long you keep the backlight on for, and how bright you have it set. On + bright = less runtime
- How many digital frequencies/trunked systems you listen to. Digital decoding = less runtime
- Whether you have the Battery Save setting on or off in certain modes. When it's on, after 1 minute of no activity, it turns off the RF power for 1 second, turns it on for 300ms, off for 1 second, and so on. Note that this feature is generally pretty useless and misleading, as it only works when the scanner is holding on a single frequency, it does not work in scan mode.
- The type and condition of the batteries. This is the most obvious and I already touched on it. The higher the capacity = longer runtime. Newer batteries = longer runtime. Charging the batteries in a smart charger which charges each cell separately and evenly = longer runtime.