w3 total cache and post__not_in

If you have followed the code of the recent page widget then what you are trying to achieve can’t be done as naively as you are trying to do it. Recent posts widget caching is based on the assumption that the same output is displayed everywhere which is why it can calculate the cache on any page and use it on any other page, but this assumption do not apply to your case as you want different output on some pages.

The easiest way to go around it is to have a different cache key for each post like recent-posts-{post id}.