Fundamentally the difference between the TextIOWrapper and BufferedWriter is what they are designed to process. Having a look at the Python documentation you'll see that BufferedWriter is designed to handle byte streams:
BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer streams that are readable, writable, and both readable and writable.
While the TextIOWrapper is designed to handle byte-streams that are specific to text, handling things like encoding and decoding.
Another IOBase subclass, TextIOBase, deals with streams whose bytes represent text, and handles encoding and decoding from and to unicode strings. TextIOWrapper, which extends it, is a buffered text interface to a buffered raw stream (BufferedIOBase).
As for which one you should be calling flush on. It's a wash since the TextIOWrapper is actually just a nice wrapper for text BufferedIOBase. So if, as you say, you are actually handling binary data and not text-based data, then you could just use the BufferedIOBase.