Just playing with the idea idea to see what I can get starting from scratch, here.
First of all, don't maintain every single point, just maintain a list of rectangular regions in which boxes can be inserted. When you start out the list will contain only one region - the entire space. Call it [0,0,fullwidth,widthheight]; the zeros are x and y coordinates. Keep the list sorted by x and y coordinate.
Now consider adding a box [w,h]. You will take two passes through the list.
On the first pass you are looking for a region [x,y,width,height] that is large enough to contain the box (i.e., width>=w and height>=h). Assuming you find one, its x and y coordinates give you the box's position, and you can go on to the second pass.
In the second pass you look at each region in the list and determine if it intersects with your box (there will be at least one such). If it does, remove it from the list and add up to three more new regions (since you're traversing the list it may be easier to build a new list, copying nonintersecting regions over).
Since the box will touch or overlap at least one edge of each region, the situation will look something like (assuming we're talking about the top edge)
a----e====f----b
| |****| |
| |****| |
| |****| |
i g----h j
| |
c----k----l----d
Where the region is marked out by a,b,c,d; the part of the box intersecting the region is e,f,g,h; and i, j, k and l show where the edges of the box would meet the sides of the region if they were extended.
The region marked out by a,b,c,d is thrown away, and replaced by three new regions: those marked out by a,e,c,k; f,b,l,d; and i,j,c,d (yes, they overlap each other). If the box meets more than one edge, then fewer regions will be produced; for example, if the box meets both the top and bottom edges then i,j,c,d disappears.