Why is ArcPy script slow?

If you need to create a second cursor for parcels.shp, do so outside of the loop for your first cursor. As it stands, your script is creating a new cursor object for each row in malls.shp which is what's costing you all that processing time.

...
rows = arcpy.UpdateCursor('malls.shp',"","",'ParcelID')
polyrows = arcpy.SearchCursor('parcels.shp')
for row in rows:
    t4 = datetime.datetime.now()
    pt = row.Shape.getPart()
    for polyrow in polyrows:
...

The problem with @Jason's answer (and your original approach) is that it does not take advantage of the spatial index and requires a nested, two-cursor loop which is going to become exponentially slower as the number of points increases.

An alternative workflow that may be faster while still letting you update the point feature class in-place (Spatial Join only outputs a new feature class, not updates an existing one) might be to:

  1. Use Spatial Join to create an intermediate (perhaps in-memory) feature class
  2. Use Add Join to join the intermediate feature class to your existing point feature class
  3. Use Calculate Field or an UpdateCursor to copy over the values in the joined field to the field in the existing point feature class.