after the first occurrence of Set sht = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)), sht will NOT be Nothing even if Set sht = ThisWorkbook.Sheets(cell.Value) should fail
so be sure to set sht to Nothing at each iteration
while ... .Copy sht.Range("A1") will always be pasting from cell A1 of the target sheet, hence you have to update the target cell like with sht.Cells(Rows.Count, 1).End(xlUp).Offset(1)
So that you could use the following:
For Each cell In rng
    If Len(cell.Value) > 0 And Not IsNumeric(cell.Value) Then
        Set sht = Nothing ' set sht to Nothing and erase the result of the preceeding loop
        On Error Resume Next
        Set sht = ThisWorkbook.Sheets(cell.Value)
        On Error GoTo 0
        If sht Is Nothing Then
            Set sht = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            sht.Name = cell.Value
        End If
        ws.Range("A" & cell.Row & ":H" & cell.Row).Copy sht.Cells(Rows.Count, 1).End(xlUp).Offset(1) 'paste starting from column A first empty cell after last not empty one
    End If
Next cell