Fixed it - problem was not with my while loops NOR with the delete row function but rather with my logic and incorrect use of FIDs... Here is the correct code:
# ---------------------------------------------------------------------------
# IterativeNearAnalysis.py
# Created on: thu oct 19 2011 by Amelie Davis
# Takes all shapefiles in a folder
# if points are identical in terms of lat long, removes one point at random
# checks the distance between all points in that same shapefile is less than a specified distance
# deletes at random one of the two 'offending points'
# creates a new shapefile with only the points that are wanted
# checks the output
# final output is a .dbf of the attribute table for those points
# ---------------------------------------------------------------------------
# Import system modules
import arcpy
from arcpy import env
import os
from os import path
# input shapfile
inputfile = arcpy.GetParameterAsText(0)
# default inputfile = "d:/data/leap540/52spp_withid_1000m/BCN_Birds_P_top52spamecro.shp"
#distance to look for points
dist2 = arcpy.GetParameterAsText(1)
dist = dist2 + " Meters"
# default dist2 = 500
#workspace
wksp = arcpy.GetParameterAsText(2)
arcpy.AddMessage("Workspace is "+ wksp)
#set the workspace
arcpy.env.workspace = wksp
(dirName, fileName) = os.path.split(inputfile)
# outputfiles
# Name of output shapefile from which points that are located at the exact same spot are removed
out1 = fileName[:-4]+"_copy.shp"
# make a copy of inputfile and name it out1
arcpy.Select_analysis(inputfile,out1,"#")
# Names of output tables and shapefiles
out1_a = out1[:-4]+"_sort.shp"
out2 = out1_a[:-4] + dist2 + "_near.dbf"
out3 = out2[:-4] + "_sort2.dbf"
# final output
out4 = arcpy.GetParameterAsText(3)
# check output
out5 = out3[:-4] + "_check.dbf"
arcpy.AddField_management(out1,"RANDOM","SHORT","5","#","#","#","NULLABLE","NON_REQUIRED","#")
codeblock1= "dim max, min\nmax=99999\nmin=0\nx=(Int((max-min+1)*Rnd+min))"
arcpy.CalculateField_management(out1,"RANDOM","x","VB",codeblock1)
arcpy.AddField_management(out1,"FID_COPY","SHORT","6","#","#","#","NULLABLE","NON_REQUIRED","#")
arcpy.CalculateField_management(out1,"FID_COPY","[FID]","VB","#")
# delete records that are identical in latitute and longitude
# make sure the point to delete is selected at random by sorting by random
arcpy.Sort_management(out1,out1_a,"RANDOM ASCENDING","#")
fields = ["LATITUDE","LONGITUDE"]
arcpy.DeleteIdentical_management(out1_a,fields,"#","0")
# generate list of points that are within a certain distance (specified by 'dist') or each other
arcpy.GenerateNearTable_analysis(out1_a,out1_a,out2,dist,"NO_LOCATION","NO_ANGLE","ALL","0")
arcpy.AddField_management(out2,"RANDOM2","SHORT","5","#","#","#","NULLABLE","NON_REQUIRED","#")
arcpy.CalculateField_management(out2,"RANDOM2","x","VB",codeblock1)
arcpy.Sort_management(out2,out3,"RANDOM2 ASCENDING","#")
arcpy.DeleteIdentical_management(out3,"NEAR_DIST","#","0")
rows = arcpy.SearchCursor(out3)
i_fid = "NEAR_FID"
a = []
arcpy.MakeFeatureLayer_management(out1_a,"grumble")
row = rows.next()
while row:
i_fid1 = row.getValue(i_fid)
arcpy.AddMessage("FID of row to delete is "+ str(i_fid1))
rows2 = arcpy.UpdateCursor(out1_a)
row2 = rows2.next()
while row2:
i_fid2 = row2.getValue("FID")
cute = row2.getValue("L_ID")
#arcpy.AddMessage("FID of row we are on is "+str(i_fid2))
if i_fid1 == i_fid2:
b = "L_ID = " + str(cute)
a.append(b)
arcpy.AddMessage("deleting row"+ str(i_fid2)+" and original loc is " + str(cute))
row2 = rows2.next()
row = rows.next()
#arcpy.AddMessage("out of loop")
del row
del row2
cntr = 0
while cntr<len(a):
f_query = a[cntr]
arcpy.SelectLayerByAttribute_management("grumble","ADD_TO_SELECTION",f_query)
arcpy.AddMessage(f_query)
cntr +=1
arcpy.SelectLayerByAttribute_management("grumble","SWITCH_SELECTION","#")
arcpy.Select_analysis("grumble",out4,"#")
arcpy.GenerateNearTable_analysis(out4,out4,out5,dist,"NO_LOCATION","NO_ANGLE","ALL","0")
# delete out2 and out3