How do I split the edges on all objects in a scene with a script?
Using bmesh.ops.split_edges(..)

Test script, object mode, for all unique meshes of all mesh objects in the scene, load a bmesh, split all edges, rewrite to mesh.  Need only pass edges of the bmesh to the operator. 

import bpy
import bmesh
context = bpy.context
scene = context.scene

bm = bmesh.new()
meshes = set(o.data for o in scene.objects if o.type == 'MESH')
for me in meshes:
    bm.from_mesh(me)
    bmesh.ops.split_edges(bm, edges=bm.edges)
    bm.to_mesh(me)
    bm.clear() 

bm.free()    


On smooth shading AFAIK it is set on a per face basis. Using the methods outlined here Using python to set object shading to &#39;smooth&#39; could make a flag to check if any, or in this case all the faces have smooth shading.

# check if all faces in bmesh are smooth
is_smooth = all(f.smooth for f in bm.faces)


Some notes on question code:

when using operators its far better to iterate over context.scene.objects or if pre selected context.selected_objects.  The collection bpy.data.objects is all objects in the blend whether linked to context scene any scene or no scene.  As well as being selected you also want to set the object to active, and select all geom before calling operator

mesh_objects = [o for o in context.scene.objects if o.type == 'MESH']
meshes = set(o.data for o in mesh_objects)
for ob in mesh_objects:
    if not meshes:
        break
    elif ob.data not in meshes:  
        continue
    context.scene.objects.active = ob
    ob.select = True
    bpy.ops.object.editmode_toggle()
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.mesh.edge_split()
    bpy.ops.object.editmode_toggle()
    meshes.remove(ob.data)


Note that 100 objects in a scene could share one mesh, hence the logic above to avoid calling the operator on the same mesh 100 times. 

No biggy, but as a generality, i is used for integer iterators.