An art indeed! 
I haven’t used WP Rocket myself, but I hear very good things about it.
The exclusion you have for /wp-content/plugins/s2member/s2member-o.php applies to s2Member’s dynamic CSS/JS loader. The new static files are under /wp-content/uploads/s2member-assets/, and those are intentionally designed to be cacheable, so I wouldn’t exclude them from caching.
Caching is perfectly fine for those files. That was really the point of most of the refactor I did in this area: make s2Member’s frontend CSS/JS properly cacheable.
The dynamic values that can change with the current user are no longer built into those asset files. I moved those out and now add them inline with the WordPress page being served. That way the static CSS/JS files don’t contain those non-cacheable values, which is safer and also lets browsers reuse the same files much more effectively, even for logged-in users.
Looking at your WP Rocket settings, I notice that “Delay JavaScript execution” is disabled, so that particular feature doesn’t seem to be the cause here.
You do have JavaScript combining and deferred loading enabled, though, and “Load CSS Asynchronously” too. Those can change when and where the CSS/JS actually becomes active on the page. That could explain why s2Member’s 1-second runtime check didn’t see its completion markers even though the files themselves were fine when checked afterwards.
If we need to troubleshoot this further before I release the adjustment, one useful test would be to temporarily exclude the s2Member files under /wp-content/uploads/s2member-assets/ from WP Rocket’s CSS/JS optimization processing and see whether the notice stops. I wouldn’t consider that a permanent requirement, though. The goal is for s2Member to work well with normal caching/optimization setups without needing special exclusions.
And yes, moving your workaround into a WordPress hook/filter hack like that is much better than editing the s2Member plugin files directly, since it won’t be overwritten by an update.
That hack is fine for now if the repeated notice is getting in the way. Just keep in mind that it suppresses the whole s2Member frontend-asset notice system, including notices for real delivery problems where the automatic fallback/recovery information could be useful.
Once I release the adjustment, I’d remove that hack again. I’m changing this particular runtime warning so it behaves more appropriately, without losing the useful notices for actual asset failures.
I added those notices/warnings for a few different scenarios so problems would become obvious sooner, and I also added fallback/recovery measures to try to keep things working when something is not right.
I couldn’t list every detail in the changelog, but I tried to give the general idea. I really did try to think through as many situations as possible, but I didn’t expect the behavior you came across. I thought that checking after the page had finished loading was already late enough to make sure s2Member’s CSS/JS were active, while still catching a real failure quickly enough that a visitor wouldn’t be left looking at a broken Pro-Form.
I’m glad you mentioned the notices and your WP Rocket setup, because it gives me a real-world case to improve this against.
I’ll try to have a follow-up release with an improvement for this today, trying to avoid other site owners from also getting those notices in similar setups. In the meantime, with logging enabled, if it happens again, we can look at more details in s2Member’s css-js.log file.
