Edit a function to take different actions based on user role

wp_update_post() ends up using wp_insert_post(), which has wp_insert_post_data inside it. The filter “Filters slashed post data just before it is inserted into the database.” I think that would be suitable moment to add the custom logic you described as publishorpend method doesn’t seem to have other filters available in it.

You could perhaps do something like this,

add_filter('wp_insert_post_data', 'filter_wp_insert_post_data', 10, 2);

function filter_wp_insert_post_data( $data, $postarr ) {
  // Only affect custom post type. Update the post type slug!
  if ( 'my_post_type' !== get_post_type($data['ID']) ) {
    return $data;
  }

  // You may want to have some extra checks so that the status change doesn't affect every post of this type
  // if ( ! some_theme_or_plugin_function_to_check_if_orphaned($data['ID']) ) {
  //   return $data;
  // }

  // assuming the function returns boolean or truthy/falsy value
  $requires_approval = mylisting_get_setting( 'submission_requires_approval' ); 

  // If submission_requires_approval is false, post_status should be set to publish no matter what the user role is (this is how the function works currently).
  if ( ! $requires_approval ) {
    return $data;
  }

  // if current user is a member of administrators or editors, the post status should be set to publish. note, the current user may have more than one role assigned.
  // As a personal preference, check capabilities instead of role. Admins and editors can edit_others_posts
  if ( current_user_can( 'edit_others_posts' ) ) {
    $data['post_status'] = 'publish';
  // If submission_requires_approval is true and if the current user is a group other than admin/editor (or is not logged in at all*) post_status should be set to pending.
  } else if ( $requires_approval ) {
    $data['post_status'] = 'pending';
  }

  return $data;
}

This is just an example and may need some tweaking to match your exact setup and needs.