Good call Vovka. I did know there was some weird situations with the handle. Actually noted some issue with deleted entities as well in an old Augi thread:
http://forums.augi.com/showthread.php?92053-Help-Rotation-angle-of-text&p=918573&viewfull=1#post918573But obviously your brute-force method could become extremely slow on large drawings. That's the main reason for using the handle decrement idea. I wonder if something similar could be achieved using ObjectID's instead? Though I think those are random numbers (i.e. the drawing database has a hash-table index and the ID is the hash code), but would have to check.
Another issue with yours is it won't work inside of block definitions. Neither would the selection set versions. E.g. if the given ename is a nested entity inside a block, entnext gives the next entity inside that block - so you'd expect this entprev to give the previous entity also. Same would go for dictionaries & xrecords.
Perhaps that is the idea Owen mentioned about optimizing: If the given entity is inside a block then only search from that block's nested entities, if outside then skip all entities owned by a block record (which is not too difficult as it's just a dxf code of any one of the nesded entities). Though going through all possibilities could become a bit hairy since Model space and Paper Space tabs are also stored as block definitions, but in their case entnext mashes them up.