How to mirror a mesh on x-axis on pivot point with python?
Simple mirror in place about origin

To mirror about the X axis (the ZY plane) at the origin is a simple matter of negating the x vert coordinate (v.co.x = -v.co.x or v.co.x *= -1)  Sample script run in edit mode, mirrors all verts.

import bpy
import bmesh

context = bpy.context
ob = context.edit_object
me = ob.data

bm = bmesh.from_edit_mesh(me)
for v in bm.verts:
    v.co.x *= -1

bmesh.update_edit_mesh(me)


Matrices

Check out the layout of a transform matrix an example of which it the 4x4 matrix ob.matrix_world .   Just setting the matrix value to -1 as shown in question will not work as expected in all cases.   

A transform matrix T to mirror on x axis would be identity with T[0][0] = -1  Or a scale matrix T = Matrix.Scale(-1, 3, (1, 0, 0))

T = Matrix.Identity(3)
T[0][0] = -1
bmesh.ops.transform(bm, 
        verts=bm.verts, 
        matrix=T, 
        space=Matrix.Translation(-pp))


Where pp is the point on x axis about which to mirror, Can exclude (as it's default) when mirroring about the origin pp = Vector((0, 0, 0)) or since it's default pp = Vector(). 

Another example from py console run in object mode, will mirror mesh about axis by transforming vertices of the mesh.vertices collection 

&gt;&gt;&gt; T = Matrix.Scale(-1, 4, (1, 0, 0))
&gt;&gt;&gt; C.object.data.transform(T)
&gt;&gt;&gt; C.object.data.update()


On an object level

&gt;&gt;&gt; C.object.matrix_world *= T.to_4x4()


Finally to mirror about some arbitrary pivot point, will need to translate such that the pivot point is the origin, mirror,  then translate back.  This is the equivalent object level result of changing space in a bmesh operator with the translation matrix.

&gt;&gt;&gt; pp = Vector((3, 0, 0))
&gt;&gt;&gt; A = Matrix.Translation(-pp) * T * Matrix.Translation(pp)
&gt;&gt;&gt; C.object.matrix_world *= A


this may quite likely invert some normals that will need to be fixed later.

Putting it together to mirror each mesh about a designated axis using the scene scene cursor location as pivot point, and correcting the normals. Run this script in object mode.

import bpy
from mathutils import Matrix 
import bmesh

context = bpy.context
scene = context.scene
pp = scene.cursor_location # in global coords
mesh_obs = (o for o in scene.objects if o.type == 'MESH')
bm = bmesh.new()
axis = 0 # x, y, z = 0, 1, 2
T = Matrix.Scale(-1, 4, Matrix.Identity(3)[axis])
for ob in mesh_obs:
    me = ob.data
    bm.from_mesh(me)
    lpp = ob.matrix_world.inverted() * pp # pivot point local coords
    bmesh.ops.transform(bm, matrix=T, space=Matrix.Translation(-lpp), verts=bm.verts)
    # recalculate the normals
    bmesh.ops.recalc_face_normals(bm, faces=bm.faces)
    bm.to_mesh(me) # write to mesh
    me.update()
    bm.clear() # clear for the next one.
bm.free() # free the mem used by bmesh


Bmesh Mirror operator 

bmesh.ops.mirror(...)

Test script run in edit mode. Will mirror the whole mesh on x to the scene cursor location's local x location.  Creates new geometry as the mirror.  Remove the original to only leave the mirrored result.



import bpy
import bmesh
from mathutils import Vector, Matrix
from math import radians, degrees
context = bpy.context
scene = context.scene
ob = context.edit_object
me = ob.data

bm = bmesh.from_edit_mesh(me)

pp = ob.matrix_world.inverted() * scene.cursor_location
bmesh.ops.mirror(bm, 
        geom=bm.faces[:] + bm.verts[:] + bm.edges[:],
        axis=0,  # x, y, z &lt;==&gt; 0, 1, 2
        matrix=Matrix.Translation(-pp), 
        merge_dist=-1 # disable so center verts dont merge.
        )
bmesh.update_edit_mesh(me)


Note the operator returns the new geometry.. ret = bmesh.ops.mirror(...) in a dictionary. new_geom = ret["geom"].