How to scale plane 2d with bmesh and floatproperty in ui?
Use a setter getter on the property



Can keep the previous value of a property using the custom property ob["scale_factor"] to store the previous value.

Warning will cause an issue if you hit exactly 0.0, which may need to be handled in some way.

import bpy

def draw(self, context):
    layout = self.layout
    ob = context.object
    layout.prop(ob, "scale_factor")

def set_float(self, value):
    prev_sf = self.get("scale_factor", 1)
    sf = value / prev_sf
    self.scale.xy *= sf
    self["scale_factor"] = value


def get_float(self):
    return self.get("scale_factor", 1)        

def register():
    bpy.types.Object.scale_factor = bpy.props.FloatProperty(get=get_float, set=set_float)
    bpy.types.TEXT_HT_footer.append(draw)

def unregister():
    pass
    # TODO

if __name__ == "__main__":
    register()


I have done the scaling on an object level here. For a mesh could use bmesh and

bmesh.ops.scale(bm, 
        vec=(sf, sf, 1),
        space=Matrix.Translation(-pp), # pivot point (x, y, 0)
        verts=bm.verts)


or simply make the scale and translation matrices and 

import bpy
from mathutils import Matrix, Vector
pp = Vector((1, 1, 0))
sf = 2
me = bpy.context.object.data

Sxy = Matrix.Scale(sf, 4, (1, 0, 0)) @ Matrix.Scale(sf, 4, (0, 1, 0))

me.transform(Matrix.Translation(-pp))
me.transform(Sxy)
me.transform(Matrix.Translation(pp))