### Godot version

4.1 621d68e

### System information

Windows 10.0.19045 - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 1060 (NVIDIA; 30.0.15.1403) - Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 Threads)

### Issue description

When you create a Control node, that contains theme items, in a thread, e.g.
```GDScript
func _ready() -> void:
	var thread := Thread.new()
	thread.start(make_control)
	thread.wait_to_finish()

func make_control():
	var vb = VBoxContainer.new()
	add_child.call_deferred(vb)
```
it results in an error
```
Control::get_theme_constant: This function in this node can only be accessed from either the main thread or a thread group. Use call_deferred() instead.
```
The error comes from the `var vb = VBoxContainer.new()` line, so using `call_deferred()` is obviously not possible (unless we were able to await it somehow). The reason for error is that controls initialize their theme cache in `NOTIFICATION_POSTINITIALIZE`.

The code above is perfectly thread-safe and not allowing it makes it very inconvenient to create Control branches in thread (e.g. when you populate a list or something). Well, it does work, but the error results in a spam, so it should be prevented. Either we could remove the theme initialization from POSTINITIALIZE (the node is not inside tree yet, so not sure how much is it useful) or remove it, but only when the node is not in main thread.

### Steps to reproduce

Run the code above.

### Minimal reproduction project

N/A
GDCLASS(ClassDB, Object);
protected:
	static void _bind_methods();
public:
	PackedStringArray get_class_list() const;
	PackedStringArray get_inheriters_from_class(const StringName &p_class) const;
	StringName get_parent_class(const StringName &p_class) const;
	bool class_exists(const StringName &p_class) const;
	bool is_parent_class(const StringName &p_class, const StringName &p_inherits) const;
	bool can_instantiate(const StringName &p_class) const;
	Variant instantiate(const StringName &p_class) const;
	bool class_has_signal(StringName p_class, StringName p_signal) const;
	Dictionary class_get_signal(StringName p_class, StringName p_signal) const;
	TypedArray<Dictionary> class_get_signal_list(StringName p_class, bool p_no_inheritance = false) const;
	TypedArray<Dictionary> class_get_property_list(StringName p_class, bool p_no_inheritance = false) const;
	Variant class_get_property(Object *p_object, const StringName &p_property) const;
	Error class_set_property(Object *p_object, const StringName &p_property, const Variant &p_value) const;
	bool class_has_method(StringName p_class, StringName p_method, bool p_no_inheritance = false) const;
	TypedArray<Dictionary> class_get_method_list(StringName p_class, bool p_no_inheritance = false) const;
	PackedStringArray class_get_integer_constant_list(const StringName &p_class, bool p_no_inheritance = false) const;
	bool class_has_integer_constant(const StringName &p_class, const StringName &p_name) const;
	int64_t class_get_integer_constant(const StringName &p_class, const StringName &p_name) const;
	bool class_has_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false) const;
	PackedStringArray class_get_enum_list(const StringName &p_class, bool p_no_inheritance = false) const;
	PackedStringArray class_get_enum_constants(const StringName &p_class, const StringName &p_enum, bool p_no_inheritance = false) const;
	StringName class_get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false) const;
	bool is_class_enabled(StringName p_class) const;
	ClassDB() {}