I don't know why scaling is not taken into account (since you can apply scale it is not a real restriction.
To test this create a plane and run the script, set your cursor to some other location and run again.
Note: this doesn't work properly if the polygon is parented.

import bpy
from bpy import context
import mathutils
from mathutils import Matrix
import math
def track_to_point( obj, point ):
normal = obj.data.polygons[0].normal.xyz
mat_obj = obj.matrix_basis
mat_scale = mathutils.Matrix.Scale(1, 4, mat_obj.to_scale() )
trans = mat_obj.to_translation()
mat_trans = mathutils.Matrix.Translation(trans)
print( "mat_scale\n" + str(mat_obj.to_scale()))
point_trans = point -trans
q = normal.rotation_difference( point_trans )
mat_rot = q.to_matrix()
mat_rot.resize_4x4()
mat_obj = mat_trans * mat_rot * mat_scale
obj.matrix_basis = mat_obj
plane = bpy.data.objects['Plane']
point = bpy.context.scene.cursor.location
track_to_point( plane, point )
Parenting is explained in detail here
Roles of matrices
Matrix access to location, rotation and scale (including deltas), before constraints and parenting are applied
Parent relative transformation matrix
Inverse of object’s parent matrix at time of parenting
Worldspace transformation matrix