I have used Dynamic Paint to solve the main problem. A frame sequence derived from Dynamic Paint to select which particles fall under gravity, and which do not.
I tried to upload an animated gif to show this, but it says that file type is not allowed here (even though ‘.gif’ is!?).
Some particles remain slow because of what i mentioned above:
The only problem is that some particles fall slower than others, and they are the ones that are on parts of the texture where white borders onto black. SO, I thought this was because of of antialiasing between black and white. So I went back to photoshop and posterised the texture so that all pixels are either 100% black or 100% white (no greys), and yet the slow gravity on pixels that borders between black and white still occur. I can only think this is because Blender is antialiasing the texture internally.