If you have not one set of 4 points, but several ones, you can slightly modify the expression to subdivide all rectangles at once. For this, you have to define an array for each rectangle, listing the points as you can see in the screenshot (find the expression below):
collect_geometries( case when @id=1 -- must be a valid $id value of one of the points then with_variable('no',13, -- no. of sub-polygons you want the polygon to divide into array_foreach( array ( array (0,1,19,18), array (19,18,20,15), array(22,11,23,10), array(20,15,21,14), array(21,14,22,11), array(2,3,17,4), array(17,4,16,5), array(16,5,13,6), array(13,6,12,7), array(12,7,9,8) ), with_variable( 'line1', make_line ( geometry (get_feature_by_id ('points', @element[0])), -- $id of point at bottom left geometry (get_feature_by_id ('points', @element[1])) -- $id of point at bottom right ), with_variable( 'line2', make_line ( geometry (get_feature_by_id ('points', @element[2])), -- $id of point at top left geometry (get_feature_by_id ('points', @element[3])) -- $id of point at top right ), collect_geometries ( array_foreach ( generate_series (1,@no), make_polygon( make_line( end_point( line_substring ( @line1, 0, length(@line1)/@no*(@element-1) ) ), end_point( line_substring ( @line1, 0, length(@line1)/@no*@element ) ), end_point( line_substring ( @line2, 0, length(@line2)/@no*@element ) ), end_point( line_substring ( @line2, 0, length(@line2)/@no*(@element-1) ) ) )))))))) end ) 

