Scrum Team Members Aren't Individual Resources
When this happens, should you add items from the backlog into the sprint for the developer to complete during the time he is waiting for his colleague to complete his side of the work? Or should you let the developer freestyle?
Neither. Your process needs to stop thinking of developers as individual resources. Instead, the Development Team is collectively responsible for the stories accepted into the Sprint in support of the Sprint Goal.
Never Pull Product Backlog Items Unless Sprint Backlog's Empty
In the mean time, [the blocked developer] was working on items in the backlog out of his own accord, since the rest of items in the sprint required his colleague to completed before he could intervene.
100% utilization is not the point of agile processes, so the question shouldn't be whether the developer was busy, but rather whether or not he was contributing in a sustainable way to the team's overall effort. Working on other work already in the Sprint Backlog while waiting for a prerequisite task to become unstuck is certainly one viable option, so long as it doesn't introduce task-switching overhead.
Another option is for developers to combine resources to complete stories that require more effort to complete. While Brooks' Law may still apply in some cases, on a small team it can be very helpful to do pair programming or collectively swarm over stories to reduce work-in-progress.
No matter how you approach the situation, under no circumstances should you be introducing new work into an incomplete Sprint. This is an anti-pattern based on notions of individual productivity and idempotent tasking, neither of which is relevant to a well-run Scrum implementation. All work should come from the Sprint Backlog until the Sprint Backlog is empty or the Sprint Goal has been met according to the Definition of Done.