Currently, decision on whether or not a sand/gravel block can fall if placed above another block uses hard-coded checks (on Material.water and .lava, for example).
This makes it nearly impossible to get falling blocks if neither water nor lava can be used with newly added blocks (besides creating a falling entity on our own within onNeighborBlockChange and making some wild assumptions on whether or not sand was placed above "our" block as no side information is passed).