Извиняюсь перед почтенной публикой за “говнокод”.

Убрал
     def active(self):
        self.tl.mainloop()
этот лишний “цикл” скорей всего и оставался рабочим

Теперь это выглядит так.
 # -*- coding: utf-8 -*-
import tkinter as tk
class Win:
    num = 0
    def __init__(self, root, perent, func) -> None:
        self.root = root
        self.parent = perent
        self.func = func
        Win.num += 1
        self.num = Win.num
        self.tl = tk.Toplevel()
        self.tl.geometry("600x400")
        self.fr = tk.Frame(self.tl)
        self.fr.pack()
        self.bt = tk.Button(self.fr, text='Добавить окно', command = self.parent.start)
        self.bt.pack()
        self.bt = tk.Button(self.fr, text='Закрыть последнее открытое окно', command=self.exit1)
        self.bt.pack()
        tk.Label(self.tl, text=str(Win.num)).pack()
    def exit1(self):
        self.func()
    def __del__(self):
        print('__del__', self.num)
class Wroot:
    ltp = []
    def __init__(self, root):
        self.root = root
        self.root.geometry("800x600+10+10")
        self.fr = tk.Frame(self.root)
        self.fr.pack()
        self.bt = tk.Button(self.fr, text='Добавить окно', command = self.start)
        self.bt.pack()
        self.bt1 = tk.Button(self.fr, text='Закрыть последнее открытое окно', command = self.win_del)
        self.bt1.pack()
    def start(self):
        Wroot.ltp.append(Win(self.root, self, self.win_del))
    def win_del(self):
        if len(Wroot.ltp) > 0:
            Wroot.ltp[-1].tl.destroy()
            del Wroot.ltp[-1]
if __name__ == '__main__':
    root = tk.Tk()
    Wroot(root)
    root.mainloop()

Всем большое спасибо за помощь.