If I flush the CF cache, images start to cache across my site pretty quickly and everything works great.
However, after a while they stop caching and start showing as external.
It’s clearly misidentifying images as external. When I want to see what’s really going on, I use the Network tab of my browser’s Dev Tools and inspect the headers myself.
p.s. You mentioned an Expiry in the past, but the only date I see is in 2021.
Does the rule apply only to images, as implied by the /bn_img/* path? If so, you could set a much higher Edge Cache TTL, and flush them as needed.
Also, Cache Everything will not affect Cloudflare’s caching for images, which is done by default. This directive only affects HTML content.
Instead, you could perhaps benefit (for the above path) from Cache Level: Ignore Query Strings. If the query strings appended to the JPG files are random values added for some kind of control that do not change the image being requested, this setting might greatly improve the caching level for these images.
However, you should not apply the Cache Level: Ignore Query Strings to the whole domain without first doing some careful investigation, but instead use page rules, because this setting applies to all static files, not only images. There are normally other static files who may have differences set by query strings, like, example.com/style.css?ver=1.0 vs example.com/style.css?ver=1.1.