Hey there Camcorder and other new LM's, I've been thinking about your post and I have some ideas for you.
My philosophy for running a game is that I ultimately have control over what happens, and if I or the players don't like what is happening I have total freedom to do something about it.
If the fight is too easy, then more opponents can always show up, but that is not usually the problem.
It takes some practice to get a good sense of what they can handle. It is ok to err on the side of having an opponent who may be too tough but have a safety net ready or fudge some dice if they can't handle it. You make adjustments next time and soon they don't need the safety net anymore.
Alternatively, you can deliberately create a situation that they can't win, let them come close to losing, but have an ally ready to save the day. It becomes part of the story and leads them to the next phase of the adventure.
I am not going to let the players get killed. I might let them come close... but if things are going badly, Tom Bombadil isn't far off, or whoever is in the neighborhood. I have control over who gets attacked and I can spread the love around if need be. And if you want to fudge the dice because it will make the story more interesting then go ahead and fudge the dice. I think a good outcome is that half of the party are getting close to being knocked out but they win.
If their party does not have a scholar with healing skills then you can run one as an NPC. I always run an NPC as a support player and I get in on the action with them. The NPC can take one for the team or patch them up after the fight.
Another option if they are losing a fight is to have them get taken prisoner, and work out a scenario to let them escape.
The session doesn't need to revolve around a boss battle or a big fight. It's fun to throw in some action and the boss is there to cap things off but the session is about letting the players work through the problem they are facing and letting them be heroes.