### 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
bool is_stdout_verbose() const;
	int get_processor_count() const;
	String get_processor_name() const;
	enum SystemDir {
		SYSTEM_DIR_DESKTOP,
		SYSTEM_DIR_DCIM,
		SYSTEM_DIR_DOCUMENTS,
		SYSTEM_DIR_DOWNLOADS,
		SYSTEM_DIR_MOVIES,
		SYSTEM_DIR_MUSIC,
		SYSTEM_DIR_PICTURES,
		SYSTEM_DIR_RINGTONES,
	};
	String get_system_dir(SystemDir p_dir, bool p_shared_storage = true) const;
	Error move_to_trash(const String &p_path) const;
	String get_user_data_dir() const;
	String get_config_dir() const;
	String get_data_dir() const;
	String get_cache_dir() const;
	Error set_thread_name(const String &p_name);
	Thread::ID get_thread_caller_id() const;
	Thread::ID get_main_thread_id() const;
	bool has_feature(const String &p_feature) const;
	bool request_permission(const String &p_name);
	bool request_permissions();
	Vector<String> get_granted_permissions() const;
	static OS *get_singleton() { return singleton; }
	OS() { singleton = this; }
};
class Geometry2D : public Object {