### Elasticsearch Version

7.13.3

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

ubuntu

### Problem Description

When doing a shrink, a copy of each shard is first reallocated to the one node. Then a shrink is initiated, which generates new shards. In case the chosen node is above the low watermark now, the shrunk index cannot be allocated to the node. Currently, this can result in an unnecessary scale up when using autoscaling.

This relates to the work in #76206 in that fixing that one would reduce the risk of this occurring. We also have thoughts around retries in ILM to fix a stuck shrink. However, we would still need to ensure autoscaling would not scale up unnecessarily in this case (but still scale up if that is theonly  way to ensure the shrink succeeds).

### Steps to Reproduce

NA

### Logs (if relevant)

_No response_
x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/cluster/routing/allocation/DataTierAllocationDecider.java
String.join(",", tierPreference),
            tierName
        );
    }
    private static Decision debugYesAllowed(RoutingAllocation allocation, List<String> tierPreference, String tierName) {
        return allocation.decision(
            Decision.YES,
            NAME,
            "index has a preference for tiers [%s] and node has tier [%s]",
            String.join(",", tierPreference),
            tierName
        );
    }
    /**
     * Given a string of comma-separated prioritized tiers (highest priority
     * first) and an allocation, find the highest priority tier for which nodes
     * exist. If no nodes for any of the tiers are available, returns an empty
     * {@code Optional<String>}. This method takes into account the desired nodes
     * in order to know if there are planned topology changes in the cluster
     * that can remove a tier that's part of the cluster now.
     */
    public static Optional<String> preferredAvailableTier(List<String> prioritizedTiers, DiscoveryNodes nodes, DesiredNodes desiredNodes) {
        final var desiredNodesPreferredTier = getPreferredTierFromDesiredNodes(prioritizedTiers, nodes, desiredNodes);
        if (desiredNodesPreferredTier.isPresent()) {
            return desiredNodesPreferredTier;
        }
        return getPreferredAvailableTierFromClusterMembers(prioritizedTiers, nodes);
    }
    /**
     * Given a list of tiers in descending order, return the tier that's present