Frames are great components to split code out of an overcrowded unit into their own units. But when you are careless they can be quite nasty...
I confirm that in your example the paintbox OnPaint handler implemented in the frame is not executed. Opening the lfm file in an external editor I see that the instances Frame1_1 and Frame1_2 inserted into Form1 at designtime do have nil as OnPaint handlers. This is wrong - it should be the event handler inherited from the frame class, and since this is the default there should not be any OnPaint handler in the lfm for the frames in Form1. This happens too easily when you try to attach an event handler to frames' Paintbox and then change you mind and delete the handler in Form1 - no Frame1_1.Paintbox1 does not have an OnPaint handler any more! The same happens very easily with normal properties of the controls on the frame.
The only way to fix this is to delete the lines "OnPaint = nil" (of Frame1_1.Paintbox1 and Frame1_2.Paintbox) from the lfm in an external editor. You can do it in the IDE, too, when you right-click on the form in the designer and select "View source (.lfm)". But then you MUST reload the entire project to clear internal caches, and I think you must also do a "Run" > "Build".
See "frame1-wp.zip" (I took the freedom to change the OnPaint code of the frame's Paintbox a bit in order to show that something is happening when the checkbox is clicked).
You can avoid this hassle when you do not insert frames at designtime, but at runtime - see "frame1-wp-runtime.zip". This way the frame does not exist on the form at designtime, and there is absolutely no chance that you might want to click somewhere on the frame. However there an issue to be mentioned here, too: Frames created at runtime automatically get the name derived from the class - i.e. all instances of TFrame1 are named "Frame1_1" (I think this is a bug). And of course, the IDE does not like this when you add the same frame a second time! To avoid this give each inserted frame a unique name after creation, or, better, simply set it to an empty string.