Writing single pixels is a non-starter if you want any performance, even if you don't go through the overhead of a BIOS call for each pixel.
Graphics libraries in and around the EGA era were based on drawing entire lines at a time, curved lines that were segments of axis-parallel elipses, and things like filled rectangles and circles.
The interior of the big flat fills could be sped up by manipulating the write mask register: by setting more than one bit, more than one of the bit planes would accept writes at the same time, so to write a single word of FFFF or 0000 you could set or clear the bits of 16 pixels in any combination of planes you wanted. You'd first write all the planes you want to set to 0 all at once, then all the planes you want to set to 1 (or, of course, vice versa). At the boundaries of your shape, where you need to partially keep the screen content within a word or byte, you'd need to switch to a slower plane-by-plane implementation.
If you wanted more intricate graphics than you could make with plain lines or fills, you would blit (in software) bitmaps to the screen from a pre-rendered in-memory representation that was already split into planes and bytes the right way. If you wanted smooth horizontal movement, you would have 8 rendered versions of each bitmap depending on the horizontal position of the image relative to the byte boundaries.
Draw single pixels only as an absolute last resort.