How to tell which objects are using a Bezier Circle as bevel object?
I think something like this might work, but for your own sanity run this only a copy of your scene, or a small representative version of your scene. 

Just in case: 


This finds the bevel_object
if the bevel Object is used by another BezierCurve it duplicates the bevel Object and associated Curve data, 
then uses the duplicate as the replacement bevel Object. 


In code form:

import bpy

scene = bpy.context.scene

bevel_names = set()
for obj in bpy.data.objects:

    if obj.type == 'CURVE':
        name = obj.name
        b_obj = obj.data.bevel_object
        print(' {0} -&gt; {1} '.format(name, str(b_obj)))

        if b_obj:
            if b_obj.name in bevel_names:
                dup = b_obj.copy()
                dup.data = b_obj.data.copy()
                scene.objects.link(dup)
                obj.data.bevel_object = dup
                bevel_names.add(dup.name)
                # dup.parent = obj
            else:
                bevel_names.add(b_obj.name)
                #_obj.parent = obj


For the bezierCurves, it doesn't appear possible to parent the bevel object to them. A solution would be to make an empty for every BezierCurve and parent both BezierCurve and bevel Object to the empty.