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$.