metabox – Remove action of an external plugin after checking if custom post meta is set

I am writing an add-on for an external plugin, such if a custom post meta exist for the page/post, disable/remove certain action added by the external plugin, as well as action added by my own plugin.

the action that I want to remove from the external plugin is called in a class construction.

class External_Plugin {
  function __construct() {
    add_action( 'wp_footer', array( $this, 'inject-code' ) );
new External_Plugin();

I hooked my check post meta code to wp_head as shown below

class My_Plugin {
  function __construct() {
    //check if dependency satisfied
    if (!class_exists('External_Plugin')){
      add_action( 'admin_notices', array( $this,'display_dependency_error_notice' ));
      add_action( 'wp_enqueue_scripts', array($this,'my_plugin_enqueue_scripts'));
      add_action( 'wp_head', array( $this, 'check_post_meta' ));

  function check_post_meta(){
    if (!is_admin()&&get_post_meta(get_queried_object_id(), 'fbcp_disable_chat',true)){
      remove_action( 'wp_footer', array('External_Plugin','inject-code',11 ));
      remove_action( 'wp_enqueue_scripts', array($this,'my_plugin_enqueue_scripts'));
new My_Plugin()

I can see from the log that my if block in check_post_meta() was indeed fired, but neither the wp_footer action by external plugin nor my wp_enqueue_scripts hooked action got removed.
In my understanding, wp_head hook is already way after the class being constructed, hence my remove_action() are definitely called after the add_action() that I want to remove, but before the hooks these actions are fired. Can someone enlighten me what is wrong with my code, and how to use the remove_action()?

P.S. I am also confused when I can get the post ID in order to retrieve the post meta… why post id is only available by wp_head? as I tried the init hook and I could not get post ID at that stage.