This is a weakness in QGIS. The labeling in QGIS 1.9 allows you more control for label placement than even the alternative labeling method in 1.8 (Layer->Labeling as opposed to the labeling available from a layer's properties popup). In the 1.9 version you can specify to have the label centered within the visible portion of the polygon. (I just compared my 1.8 and 1.9 versions as I thought you might get these options in the former, but apparently not.)
However, centering in the visible portion of the polygon might help in many cases but it is not an absolute solution because 'visible' means the view and not what you see in the map composer, so while this helps a lot, you may still have some labels hanging off the edge.
There is s a second solution you can use (possibly in combination with using v1.9 or independently). You can use the advanced labelling options (in QGIS 1.8 you need to find this via Layer->Labels. In 1.9 it is in the Properties as in the image above). You can then apply data defined settings and set the position of your labels to ensure they are not cut. To simplify this, there are a couple of plugins that setup the required data fields for you (Plugins->Fetch Python Plugins and install either "Create Labelled Layer" or "Layer to labelled layer").
To minimise the manual effort involved in placing labels may I suggest the following work-flow: You already have created a buffer polygon for your 'safe area', so why not select all the polygons that intersect with the 'safe area' (and will therefore be visible), switch your selection (to the polygons which are not safe) and set their 'show label' field to nothing (thus turning off unsafe labels without having to manually move them).