Note that because $T_k$ are disjoint, it is trivial to **check** whether they cover $[n]$:
just add up their sizes ($|T_k| = 2^{|M_k| - |m_k|}$) and compare the sum with $2^n$: if
it is smaller than $2^n$, then there exists a uncovered subset of $[n]$, otherwise there is no such
subset.

Quite often, if there exists a polynomial time algorithm for decision problem, there also
is a polynomial time algorithm for finding a certificate. In the case of this problem it
is true as well. Indeed, consider the following procedures:

do_cover($n, T$):

$~~~~$Returns whether $T$ covers $[n]$. Checks this by simply summing up $|T_k|$.

reduce($n, T, b$):

$~~~~$Reduces each $T_k$ by leaving only sets that contain $n$ or not

$~~~~$if $b = 1$ or $b = 0$ respectively. In case of $b = 1$ element $n$

$~~~~$is also deleted from all sets that belong to $T_k$.

$~~~~$Returns reduced $T$ (and does not modify $T$)

$~~~~$This reduction preserves disjointness of $T_k$ and the

$~~~~$fact that $T_k = [m_k, M_k]$ for some $m_k, M_k \subset [n]$.

$~~~~$Reduced $T_k$ may become empty, but that does not matter much.

find_uncovered($n, T$):

$~~~~$if do_cover($n, T$):

$~~~~~~~~$no such element then

$~~~~$if n == 0:

$~~~~~~~~$just try both possibilities

$~~~~$Now, we know for sure that there exists a subset of $[n]$

$~~~~$that is uncovered and want to find this subset.

$~~~~$There are 2 possibilities: either it contains element $n$,

$~~~~$or it does not. We will just iterate over them.

$~~~~$if do_cover($n - 1$, reduce($n, T, 0$)):

$~~~~~~~~$return find_uncovered($n - 1$, reduce($n, T, 0$))

$~~~~$else if do_cover($n - 1$, reduce($n, T, 1$)):

$~~~~~~~~$return find_uncovered($n - 1$, reduce($n, T, 1$)) $\cup \{ n \}$

$~~~~$else:

$~~~~~~~~$can't happen, because there is an uncovered set

Clearly, find_uncovered runs in polynomial time of $n$ and $N$ (because do_cover does).

Now, note that the same problem is NP-hard if there is no restriction of $T_k$ being disjoint.
Indeed, consider some 3-SAT instance with $n$ variables $x_1, x_2, \ldots, x_n$ and $N$ clauses.
$T_k$ for $k = 1, 2, \ldots, N$ will consist exactly from such subsets $S$ of $[n]$ such that
setting $x_i := (i \in S)$ for all $i = 1, 2, \ldots, n$ will make $k$-th clause false. Clearly,
a solution of original problems for such $T_k$ would yield a solution to our 3-SAT instance.

P. S. The solution above for the case of disjoint $T_k$ can be implemented quite efficiently if you forego the immutability of $T$ that I used for clarity. Indeed, you only need to keep $m_k, M_k$ and sum of $|T_k|$. All queries and changes that you'll do all end up very small: you just ask whether some element belongs to
some set $m_k$ or $M_k$, do similar minor modifications to $m_k$'s and $M_k$'s (don't forget to update the sum of $|T_k|$, when doing so) and check whether the sum of $T_k$ is equal to $2^x$ for some $x$.