Some other possible reasons:
Some versions of rm will ask for confirmation before removing files with no write access. If it gets run from a script and can't get confirmation, I assume it might just leave those alone.
It's possible that some versions of rm, when run with no options and confronted with a symlink, remove the pointed-to file instead of the symlink. Those versions of rm would scare me.
Depending on the OS and/or filesystem, there might be additional properties of the a file that keeps it from being deleted (e.g. an immutable bit).
If you have a weird setup where some files in a directory are on one mounted filesystem and others are on a different one (possible with shadowed filesystems), files on a filesystem mounted read-only would of course not be deleted.