Update: Since the two surfaces are separated by a plane a much easier approach is to fill both surfaces to a plane (say, the z == 1500 plane) between the two and post-process to remove the polygons whose third coordinates are constant at z:
z = 1500.;
DeleteCases[Normal[ListPlot3D[{cc, bb}, PlotRange -> {500, 3000},
Filling -> {1 -> {z, Opacity[.5, Green]}, 2 -> {z, Opacity[.5, Green]}}]],
Polygon[{{_, _, z} ..}, ___], All]

Original answer:
David's method fills from the top surface to the z == 1 plane. To fill between the two surfaces we can
- Create a
ListPlot3D object, lp3D, using bb with filling to a plane below the cc surface (say, the plane z==0)
- Post-process the output of the previous step (a) to replace the coordinates
{x_, y_, 0.} with {x, y, w} using w from the entry of cc whose first two coordinates match {x,y}; (b) remove the polygons at the top and bottom (these happen to be in the first group of polygons)
- Use
Show to combine the result from the previous step with ListPlot3D of the two data sets.
lp3D = ListPlot3D[bb, Filling -> 0,
FillingStyle -> Opacity[.5, Green], PlotStyle -> None,
BoundaryStyle -> None, Mesh -> None];
assocc = Association[{#, #2} -> #3 & @@@ N[cc]];
lp3D = lp3D /. GraphicsComplex[a_, b___] :>
GraphicsComplex[a /. {x_, y_, 0.} :> {x, y, assocc[{x, y}]}, b];
lp3D = Replace[lp3D, {a___, {EdgeForm[], ___}, ___, b : {EdgeForm[], ___}, c___} :>
{a, b, c}, All];
Show[ListPlot3D[{cc, bb}, PlotRange -> {500, 3000}], lp3D]

Note: If you define disp = Dispatch[{#, #2} -> #3 & @@@ N[cc]]; and use {x, y} /. disp in place of assocc[{x,y}], and {0, Infinity} in place of All above, this method also works in version 9.