Here is a SparceArray version of Ali's second method which is expected to be more memory-efficient (at least for images of type "Real"):
{iW, iH} = ImageDimensions@img;
Image[Total[
Table[SparseArray[
Band[1 + Round@{iH - #[[2, 2]], #[[1, 1]]} &@cm[[i, 2, 2]]] ->
ImageData[newComps[[i]]], {iH, iW}], {i, Length[cm]}]]]

Procedural summation is even more memory-efficient:
Module[{sum = 0},
Do[sum += SparseArray[
Band[1 + Round@{iH - cm[[i, 2, 2, 2, 2]], cm[[i, 2, 2, 1, 1]]}] ->
ImageData[newComps[[i]]], {iH, iW}], {i, Length[cm]}]; Image[sum]]

Image[Fold[Plus[#1,
SparseArray[
Band[Round@{-cm[[#2, 2, 2, 2, 2]], 1 + cm[[#2, 2, 2, 1, 1]]}] ->
ImageData[newComps[[#2]], Automatic], {iH, iW}]] &, 0, Range[Length@cm]]]

Here is how this method can be applied to a three-channel RGB image (the purpose here is to ImageAdjust the components of the image independently from each other):
img = Import["https://i.stack.imgur.com/U7zdU.png"]

m = MorphologicalComponents[img, .3];
cm = ComponentMeasurements[{m, img}, {"MaskedImage", "BoundingBox"}];
newComps = ImageAdjust@ImageMultiply[RemoveAlphaChannel@#, AlphaChannel[#]] & /@
cm[[;; , 2, 1]]

{iW, iH} = ImageDimensions@img;
Image[Total[
Table[SparseArray[
Band[Round@{1 + iH - #[[2, 2]], 1 + #[[1, 1]], 1} &@cm[[i, 2, 2]]] ->
ImageData[newComps[[i]]], {iH, iW, 3}], {i, Length[cm]}]]]

Combining everything into one function:
assembleComponents[newComps_, boundingBoxes_, {iW_, iH_}] :=
Module[{sum = 0, iCh = ImageChannels[newComps[[1]]]},
If[iCh == 1,
Do[sum += SparseArray[
Band[Round@{iH - boundingBoxes[[i, 2, 2]] + 1, boundingBoxes[[i, 1, 1]] + 1}] ->
ImageData[newComps[[i]], Automatic], {iH, iW}], {i, Length[boundingBoxes]}],
Do[sum +=
SparseArray[
Band[Round@{iH - boundingBoxes[[i, 2, 2]] + 1, boundingBoxes[[i, 1, 1]] + 1, 1}] ->
ImageData[newComps[[i]], Automatic], {iH, iW, iCh}], {i, Length[boundingBoxes]}]];
Image[sum]]
Usage:
assembleComponents[newComps, cm[[;; , 2, 2]], ImageDimensions[img]]
