while howardpc described a solution, I think there should be an explaination why the error occured in the first place.
First of all this has absolutely nothing to do with the owner, and a lack of RemoveComponent. Any component will call RemoveComponent on Free, so when handling components dynamically you don't need to care about the owner at all, it will be done all internally.
The problem is here:
procedure TMonitorForm.Button1Click(Sender: TObject);
var
hwnd: TFrame;
begin
hwnd := CreateFrameAndHostPanel(pnlRight, pnlRight, pnlRight);
pntFrame := @hwnd;
Here you assign a global variable the pointer of a local variable. As soon as this procedure finishes the local variable will go out of scope and any pointer to it, will be invalid, a so called dangling pointer.
When calling free from the other event handler:
procedure TMonitorForm.Button2Click(Sender: TObject);
begin
TFrameLEDMonitor(pntFrame^).Free;
end;
The previous event has already finished, meaning the pointer is dangling and when calling free, you dereference an invalid pointer. The segfault that occurs is because the memory referenced is invalid. In fact it is not because the pntFrame is dangling, your computer can not detect that, but a TFrame is also just a pointer and therefore the derefencing of Free causes the error because the invalid pointer points to something basically "random".
Long story short, never put pointer to local variables into global variables. Second, TFrame is already a pointer, all classes are hidden pointers in Pascal, so best is to skip the middle man and use TFrame directly instead of a pointer to TFrame