Similar to ssch's method, but I though I'd throw in mine, it' just finds the normal of the polygon (The average normal if the polygon isn't planar). It then moves the polygon along this direction to create a top and bottom polygon, and then fill in the sides between these two:
normal[a_,b_,c_]:=Normalize@Cross[a-b,c-b]
normal[a___]:=Mean[normal@@@Partition[{a},3,1,1]]
sides[bottom_,top_] :=
Polygon[Reverse@Join[#1,Reverse@#2]]&@@@({bottom,top}//Transpose//Partition[#,2,1,1]&)
thicken[val_,t_:0.1]:=val/.Polygon[bottom_,___]:>
With[{top=(# +t normal@@bottom)&/@bottom},
{Polygon[Reverse@bottom],
sides[bottom,top],
Polygon[top]
}
]
Applying multiple times can lead to fun results:
initial =
Graphics3D[{Arrow@{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}},
Polygon[{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}}]}];
NestList[thicken[#, 0.3] &, initial, 2] // GraphicsRow

To use this with graphics generated by for instance Plot3D, you simply have to use Normal to expand out GraphicsComplex's. I also added a slight pattern above (The second part of Polygon[bottom_,___]) which makes the code ignore anything in polygon after the points. This is nessesary because some graphics include normals which are not accounted for above:
(Normal@Plot3D[Cos[x] Cos[y], {x, 0, \[Pi]}, {y, 0, \[Pi]},
Mesh -> None, PlotPoints -> 2]) // thicken[#, 0.3] &
