The ZODB has "blob" support. It allows to store "Binary Large OBject"s as is directly on the file system (rather than as a pickle in the ZODB's primary storage). Thus, if you have an image of 10 MB, the corresponding blob will be 10 MB: the blob contains exactly the image data. In addition, the primary storage contains a small blob representative (= proxy) with administrative data (object id, serail) necessary for the linkage between the primary storage and the blob and transaction control.
Note that while the main content is in a blob, the primary storage can still have significant information about the object: metadata, indexing data, etc.
When you scale an image PIL/Pillow will actually create a new file, which is what is stored in annotations. plone.scale does some cleanup when the image is modified https://github.com/plone/plone.scale/blob/master/plone/scale/storage.py#L223. But those scales only happen on request (if not already in annotation) - if no one is trying to view a thumb scale of an image it's not going to be in your annotations (a thumb size image is probably a negligible amount of data anyway). I would think it unlikely that the scales are contributing a large footprint in your database.