BindableEvent does not fire

It seems that your BindableEvent is fired before all of GetReplicas function calls are reached.

That won’t work because it will only change the __loaded of the replicasModule in the Init script. A module script is not global, every time you require it, you run it again on the local/server script that you required it from, and get its returned value.

That’s why when you do .__loaded = true in one script, it won’t change it globally in all scripts that require the module.

I’d recommend replacing the BindableEvent with a BoolValue (or an attribute) and do the following:
When the replicas are loaded, set its value to true, and then in the GetReplicas function only wait if it isn’t set to true yet.

Here’s how it would look in code if you replace the BindableEvent with a BoolValue called “LoadedBoolValue”, or a Boolean attribute.
ModuleScript:

local module = {
	_replicas	=	{},
}

local Loaded = script.LoadedBoolValue

function module:GetReplicas()
	if (not self.__loaded) then
		print("Waiting for the replicas...") -- This prints
		if(not Loaded.Value) then --If it's false (not loaded)
			Loaded:Get property changed signal("Value"):Wait() --Wait for the value to change 
		end
                
		print("Waited!") -- This should print when the Loaded value is true
	end
	
	return module._replicas
end


return module

Init local script:

local ReplicaController = require(game:GetService("ReplicatedStorage").Lib.ReplicaController)

local replicasModule	=	require(script.Parent)
local loadedValue		=	script.Parent.LoadedBoolValue

-- Init
ReplicaController.RequestData()

-- Replicas
ReplicaController.ReplicaOfClassCreated("Time", function(replica)
	print("Replica received!")
	replicasModule._replicas[replica.Class] = replica
end)


loadedValue.Value = true -- Update the global BoolValue to let the other scripts know they can stop waiting/don't have to wait.
print("Loaded!", replicasModule) -- This prints

This is called polling, and it’s generally not a good approach.