What I found worked best incorporated all of the answers so I thought I'd add it here rather than accept just one of them.
I used the 'peak' tool suggested by Hornbydd to create points at each peak, then I inverted my raster and ran it again to find the low points.
I contoured the DEM to a high resolution then converted the lines into polygons in ET Geowizards (or FME).
I then took a high as being a polygon that contained a peak but no troughs, and found these using select by location then exported the selection and dissolved it to marge the concentric polygons.
The code is:
##add extra toolboxes
arcpy.AddToolbox("...\Spatial Analyst Supplemental Tools.pyt")
arcpy.AddToolbox("...\ET GeoWizards.tbx")
##use the peak tool to generate a point at each peak (which are areas of local maximum elevation)
arcpy.Peak_sas(myDEM, "peakrast.tif", "peakpoints.shp")
##Invert the raster and use the peak tool to fint troughs
invDEM = Raster(myDEM)*(-1)
arcpy.Peak_sas(invDEM, "troughrast.tif", "troughpoints.shp")
##create contours from the DEM - high res
arcpy.sa.Contour(myDEM,"Contours_L_1m.shp",1)
##convert closed contours to polygons
##for small data sets this method will work but for larger there may not be enough ram - if this if the case use FME and use the AreaBuilder transformer and set create Doughnuts to no
arcpy.ET_GPPolylineToPolygon("Contours_L_1m.shp", "Contours_G_1m.shp", "FALSE")
##select closed contours containing peaks but no troughs and export to a new FC
arcpy.SelectLayerByLocation_management("Contours_G_1m", "CONTAINS", "peakpoints.shp")
arcpy.SelectLayerByLocation_management("Contours_G_1m","CONTAINS","troughpoints.shp","","REMOVE_FROM_SELECTION")
arcpy.FeatureClassToFeatureClass_conversion("Contours_G_1m.shp", arcpy.env.workspace, "HIGHS_raw.shp")
############################Option2 commented out
##select closed contours containing peaks and export to a new FC
#arcpy.SelectLayerByLocation_management("Contours_G_1m.shp", "CONTAINS", "peakpoints.shp")
#arcpy.FeatureClassToFeatureClass_conversion("Contours_G_1m.shp", arcpy.env.workspace, "Peak_Areas.shp")
##select closed contours containing troughs but no peaks and export to a new FC
#arcpy.SelectLayerByLocation_management("Contours_G_1m.shp", "CONTAINS", "troughpoints.shp")
#arcpy.SelectLayerByLocation_management("Contours_G_1m.shp","CONTAINS","peakpoints.shp","","REMOVE_FROM_SELECTION")
#arcpy.FeatureClassToFeatureClass_conversion("Contours_G_1m.shp", arcpy.env.workspace, "Low_Areas.shp")
##create a new featureclass that is the highs with the lows removed
#arcpy.Erase_analysis("Peak_Areas.shp", "Low_Areas.shp", "HIGHS_raw.shp")
##############################end of Option 2
##dissolve the feature as it is made of many concentric polygons
arcpy.Dissolve_management("HIGHS_raw.shp", "HIGHS_diss.shp")
##split The dissolved feature into single featues and add an area field
arcpy.MultipartToSinglepart_management("HIGHS_diss.shp", "final_HIGHS.shp")
arcpy.AddField_management("final_HIGHS.shp", "AREA_CALC", "DOUBLE","","","","Area")
arcpy.CalculateField_management("final_HIGHS.shp", "AREA_CALC","!Shape!.area","PYTHON_9.3")
What this doesn't do is find highs with a little low in the middle - thats what option 2 in the code is trying to do. I didnt quite get that to work because it would also create big donuts where there is a small high on the edge of a big low area. I think the perfect option would be option two then somehow checking that the inner and outer edges of the donuts are at the same height. For now though, I'm sticking with option 1.