### 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
RENDERING_DRIVER_VULKAN,
		RENDERING_DRIVER_OPENGL3,
	};
	virtual PackedStringArray get_connected_midi_inputs();
	virtual void open_midi_inputs();
	virtual void close_midi_inputs();
	void set_low_processor_usage_mode(bool p_enabled);
	bool is_in_low_processor_usage_mode() const;
	void set_low_processor_usage_mode_sleep_usec(int p_usec);
	int get_low_processor_usage_mode_sleep_usec() const;
	void set_delta_smoothing(bool p_enabled);
	bool is_delta_smoothing_enabled() const;
	void alert(const String &p_alert, const String &p_title = "ALERT!");
	void crash(const String &p_message);
	Vector<String> get_system_fonts() const;
	String get_system_font_path(const String &p_font_name, int p_weight = 400, int p_stretch = 100, bool p_italic = false) const;
	Vector<String> get_system_font_path_for_text(const String &p_font_name, const String &p_text, const String &p_locale = String(), const String &p_script = String(), int p_weight = 400, int p_stretch = 100, bool p_italic = false) const;
	String get_executable_path() const;
	String read_string_from_stdin();
	int execute(const String &p_path, const Vector<String> &p_arguments, Array r_output = Array(), bool p_read_stderr = false, bool p_open_console = false);
	int create_process(const String &p_path, const Vector<String> &p_arguments, bool p_open_console = false);
	int create_instance(const Vector<String> &p_arguments);
	Error kill(int p_pid);
	Error shell_open(String p_uri);
	Error shell_show_in_file_manager(String p_path, bool p_open_folder = true);
	bool is_process_running(int p_pid) const;
	int get_process_id() const;