How do I flip normals of duplicated faces?
Bmesh operators return resulting geometry.

Most likely only want to process a mesh once, a hundred selected
objects could all share one mesh. Hence have made a set.

Materials can be OBJECT linked. Have stuck with mesh linked
(Mesh.materials) but in general often a better option to iterate
over the object's material slots.

Make one bmesh, populate it, do stuff, write back, then clear and
repeat, then free.

The duplicate operator returns a number of items in a dictionary
regarding the result, consult the docs bmesh.ops.duplicate or
check it out in the console.
&gt;&gt;&gt; bmesh.ops.duplicate(
duplicate()
BMeshOpFunc bmesh.ops.duplicate(bmesh, geom=[], dest=None, use_select_history=False, use_edge_flip_from_face=False)
-&gt; dict(geom_orig=[], geom=[], vert_map={}, edge_map={}, face_map={}, boundary_map={}, isovert_map={})

we can get the new faces by checking for instances of
bmesh.types.BMFace in the &quot;geom&quot; key or instead I have made a list
of the values of the &quot;face_map&quot; (which is a handy dictionary with
originals as keys, and newbies as values)
It is also more often than not the case that the newly added faces are
 bm.faces[-len(faces_mat_tbh):]

the last n faces where n is the length of the to dupe list.


Changes.
import bpy
import bmesh
from bpy import context
# no need to do same on linked meshes.

mat_tbh = bpy.data.materials.get(&quot;Material&quot;)

meshes = set(
        ob.data for ob in context.selected_objects
        if ob.type == 'MESH'
        )
        
bm = bmesh.new()    
for me in meshes:
    tbh_slots = [id for id, mat 
            in enumerate(me.materials) 
            if mat
            and mat is mat_tbh]
    if not tbh_slots:
        continue
    bm.from_mesh(me)
    new_faces = bmesh.ops.duplicate(
            bm, 
            geom=[
                f for f in bm.faces
                if f.material_index in tbh_slots        
                ]
            )[&quot;face_map&quot;]
    
    bmesh.ops.reverse_faces(
            bm, 
            faces=list(new_faces.values()), 
            flip_multires=False,
            )
    bm.to_mesh(me)
    bm.clear()
        
bm.free()