Not going to go in-depth here (I'm no professional on this), but let's take an example of a wireless network card, more precisely, Broadcom's BCM4318 (that uses bcm43xx in some kernels as the kernel module/driver; some kernels have newer b43 for that).
Not going to repeat this text for the b43 kernel module, I'll just speak about bcm43xx module below.
The Linux kernel contains a module, or a driver, for Broadcom 43xx cards - the module is called bcm43xx, and is typically loaded if the appropriate hardware is present. However that native Linux driver doesn't (at least with my card) know what to do with the bcm43xx cards, and Broadcom has not released a Linux driver for this chipset - so some folks wrote a driver. But what to do with it if it can't handle the card by itself? Answer: firmware. In other words, it needs some pieces from the driver written for Windows to work. Another solution is to use NDISwrapper which wraps the Windows drivers and then that information can be used to handle the hardware device.
Well, with bcm43xx loaded, a "link" is missing between the kernel module and the real hardware. That "link" is in the Windows drivers (because Broadcom didn't provide a nice complete Linux driver). There's a special program, "fwcutter", that reads in some information from the Windows driver files, "cuts" it off and produces some "firmware files" for your Linux system. Then you copy those firmware files and put them into /lib/firmware, where bcm43xx kernel module finds them. With the "firmware files" the kernel module then knows how to work with the hardware, and from the end-user's point of view it looks like the kernel module, the driver, just works with the card.
I don't have other devices that needed firmware files in /lib/firmware, but that's what they are generally for I guess - to work in cooperation with the kernel module to be able to work with the hardware.