The log formats "%B" and "%b" log the full size of the file requested even if the client reads only a few kB and then closes the connection. Using "%O" from mod_logio is not an option because it counts the headers too instead of just the payload.
You're asking for something non-meaningful. At the network or connection level (%O) you can't distinguish between metadata (like the HTTP headers, and chunking information) and payload unless you re-parse the entire response - which would be a huge overhead. At the request level (%[Bb]), if a request is aborted you can know how much data has been encoded for the connection level, but not how much of that has been sent down the wire. The latter may also be affected by such things as SSL encryption.
The write() and sendfile() system calls do tell you how much data has been sent down the wire. Even at this level you can distinguish between headers and payload because Apache sends them separately.