Provided the format of the file doesn't change, this will work:
$m = ($a = Get-Content C:\junk\patch.txt) |
Select-String -Pattern "X Status KB Size Title" -SimpleMatch -AllMatches -Context 6,0 |
ForEach-Object{
$Server = $_.Context.PreContext[0]
$Date = [DateTime]$_.Context.PreContext[2]
$PatchLineIndex = $_.LineNumber + 1
While ( ($a[$PatchLineIndex].Trim().Length) -gt 40 -and $PatchLineIndex -lt ($a.length -1)){
[PSCustomObject]@{
Server = $Server
Date = $Date
Patch = ($a[$PatchLineIndex] -Split " ")[2]
}
$PatchLineIndex++
}
}