Assign a different material to objects within dupli_group instances
Unfortunately, I think it is not possible to do exactly what you want to do.

One of the advantages of using an Empty with dupli_group is that you don't have the overhead of storing much in the way of differences (location, rotation, scale).

If you want to alter the group, you will probably have to instantate objects by copying the data from the group.  There's actually a keyboard shortcut to Make Duplicates Real (Ctrl Shift A) that would work for interactive use.  Since you were using python in your original project here is a small python script I wrote that might accomplish your mission:

import bpy

def mission1(group, scn):

    parent = bpy.data.objects.new("parent", None)
    scn.objects.link(parent)

    for obj in group.objects:
        o2 = obj.copy()
        o2.parent = parent
        for i in range(len(o2.material_slots)):
            ms = o2.material_slots[i]
            ms.link = 'OBJECT'
            ms.material = o2.data.materials[i]
        scn.objects.link(o2)

    return parent
#
#

anchor = mission1(bpy.data.groups["Group"], bpy.context.scene)
anchor.location = [2,0,2]


The parent object is not strictly necessary, but it gives you the ability to manipulate the location and orientation of the group very much like the dupli_group empty you were using before.

An important drawback is that once you have instantiated these copies modifications to the group (adding, removing, relocating objects) will not be propagated.