Tal vez deberías "debuggar" ese código paso a paso para saber exactamente dónde salta.
Ayudaría también, por ejemplo, si subieras un pequeño proyecto con el código de generar los botones, junto con este de destruirlos.
En cuanto al código que colocas, yo optaria (para asegurarme) de dividir la condición del IF en dos, y utilizar:
Para comprobar que las diferentes propiedades están asignadas.
Código Delphi
[-]
Procedure TGesVentasBar.BorrarPanelPersonal;
var
i: Integer;
begin
for i:= ComponentCount -1 downto 0 do begin
if (Components[i] is TSpeedButton) then begin
if Assigned(TSpeedButton(Components[i]).Parent) then begin
if Assigned(TSpeedButton(Components[i]).Parent = Personal) then begin
Components[i].Free;
end;
end;
end;
end;
end;