It works fine: paint from the first click, even wothout assigning onpaint in the fomcreate.
Your guess is interesting but does not explain how paintbox.onpaint corupt button.onclick?
How one control can so unclearly ingluence another thougth I must send signals with the global vars, bot directly.
It blows my mind. I need to get some sleep. 
Well, in that case there must be something off with your testing method or a difference in widgetset/platform.
If the onpaint method is removed from the object inspector and set the dimensons of the paintbox at form create event and after that assign the onpaint event...
procedure TForm1.FormCreate(Sender: TObject);
begin
PaintBox1.Width := FieldCol * BoxSize;
PaintBox1.Height := FieldRow * BoxSize;
PaintBox1.OnPaint := @Self.PaintBox1Paint;
end;
.. and have the buttonclick event read:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1Clicked := True;
// PaintBox1.Width := FieldCol * BoxSize;
// PaintBox1.Height := FieldRow * BoxSize;
// PaintBox1.Refresh;
end;
Then the paintbox onpaint event will not be called at that click and as a result the grid will not be painted and will stay empty.
This is to be expected as changing the width or height (e.g. the value you set differs from what the value of that property already was set to) triggers for the paintbox control to be resized, in the process triggering an onpaint event.
Because code in this post does not have an onpaint event assigned while resizing the paintbox, the paintbox will not draw anything besides what it draws in its default paint implementation (which apparently is an empty box).
Hence we have to trigger the event ourselves by either using .refresh, .update, .invalidate or invoke the paint method (whatever is applicable for the situation).
See also attached project.