I have done this and it works pretty nicely:
iOS: Applying a RGB filter to a greyscale PNG
However, it is cheating, it is adding, so for (eg) the red component of each pixel, R_dest = R_src + R_tint
If you want fine-grained control, for example you might want to extract the greyscale value for each pixel by averaging the RGB components (with appropriate weighting), and then multiply this value by your tint, so the resulting colour would be greyscale(Sr,Sg,Sb) * {Tr,Tg,Tb}
This would require creating a chunk of memory, creating a bitmap context which draws into this chunk, drawing your image into this context, copying the whole memory chunk for safekeeping, processing -- taking data from the copy and modifying the original backing store, then extracting an image from the original backing store and freeing up everything you allocated.
Problem reconstituting UIImage from RGBA pixel byte data
This library has done everything for you, it isn't the most efficient route, but it gets the job done. iirc he uses malloc when he should be using calloc.