Stretch-and-folds are honestly your biggest missing piece here. If you're just letting the dough sit untouched for 4-5 hours, you're not building the gluten network that actually traps and holds onto gas bubbles. Do 4-6 sets of stretch-and-folds during the first 2 hours of bulk fermentation, spaced about 30 minutes apart. This develops strength without overworking the dough, and it's what separates dense loaves from open crumb structure. The gas is already being produced by your starter - you just need the gluten scaffold to keep it there instead of letting it escape or collapse.
Here's a practical trick that helped me: pay attention to the poke test during bulk fermentation instead of timing it by the clock. When you gently poke the dough with a floured finger, it should spring back slowly - not instantly (underdeveloped) and not stay indented (overdeveloped). That timing varies wildly depending on your kitchen temp and starter strength, so 4-5 hours might genuinely be too long or too short for your specific conditions. Also, make sure you're being really gentle during shaping. A lot of people deflate their dough too aggressively trying to create surface tension, which just squeezes out all the gas you worked to build up.
One more thing: cold proofing overnight is good, but if your kitchen is really cold or your fridge is extra cold, the dough might not be getting enough final rise time. You want some visible puffing even after the overnight proof before you score and bake. If it looks exactly the same as when it went in, bump the fridge temp up slightly or let it sit out for 30 minutes before baking.