### Website or app

Please checkout the linked branch not `main`
https://github.com/eps1lon/react-devtools-repro-no-matching-node/tree/repro/elements-leaking
Repro steps and screen recording included in the repro

### Repro steps

1. Clone repro
1. yarn
1. yarn start
1. Open app page
1. open devtools
1. Uncomment the `useEffect` block i.e. add an effect
1. inspect `Component` element
1. comment `useEffect` block i.e. remove the effect
1. Repeat comment/uncomment to see that children grow indefinitely


### How often does this bug happen?

Every time

### DevTools package (automated)

_No response_

### DevTools version (automated)

_No response_

### Error message (automated)

Could not inspect element with id 4

### Error call stack (automated)

_No response_

### Error component stack (automated)

_No response_

### GitHub query string (automated)

_No response_

Might be a duplicate of https://github.com/facebook/react/issues/21436#issuecomment-835406075 since the repro steps are the same. But depending on what the effect is doing, the behavior is different.
mostRecentlyInspectedElement !== null &&
      mostRecentlyInspectedElement.id ===
        getFiberID(getPrimaryFiber(nextFiber)) &&
      didFiberRender(prevFiber, nextFiber)
    ) {
       If 
       If 
      hasElementUpdatedSinceLastInspected = true;
    }
    const shouldIncludeInTree = !shouldFilterFiber(nextFiber);
    const isSuspense = nextFiber.tag === SuspenseComponent;
    let shouldResetChildren = false;
     The behavior of timed-out Suspense trees is unique.
     Rather than unmount the timed out content (and possibly lose important state),
     React re-parents this content within a hidden Fragment while the fallback is showing.
     This behavior doesn't need to be observable in the DevTools though.
     It might even result in a bad user experience for e.g. node selection in the Elements panel.
     The easiest fix is to strip out the intermediate Fragment fibers,
     so the Elements panel and Profiler don't need to special case them.
     Suspense components only have a non-null memoizedState if they're timed-out.
    const prevDidTimeout = isSuspense && prevFiber.memoizedState !== null;
    const nextDidTimeOut = isSuspense && nextFiber.memoizedState !== null;
     The logic below is inspired by the code paths in updateSuspenseComponent()
     inside ReactFiberBeginWork in the React source code.
    if (prevDidTimeout && nextDidTimeOut) {
       Fal
       1. 
      const nextFiberChild = nextFiber.child;
      const nextFallbackChildSet = nextFiberChild
        ? nextFiberChild.sibling