Not quite sure I understood, but try changing your table tbody to this:
<tbody>
@foreach($readers as $reader)
<tr>
<td rowspan="{{ $reader->books->count() }}">{{$reader->name}}</td>
@foreach($reader->books as $book)
{!! $loop->first ? '' : '<tr>' !!}
<td>{{$book->title}}</td>
<td>{{$book->pivot->maxreturndate}}</td>
<td>
<form action="{{ route('checkedouts.destroy', $book->pivot->id)}}" method="post">
@csrf
@method('DELETE')
<button class="btn btn-danger" type="submit">Buch zurückgebracht</button>
</form>
</td>
{!! $loop->first ? '' : '</tr>' !!}
@endforeach
</tr>
@endforeach
</tbody>
This will create a new row for each reader's book. On the first book we don't need to create a new row because we are already in the reader's name row. The rowspan attribute will make sure the reader's name span through all theirs books rows.
You can read more about the loop variable in the docs:
https://laravel.com/docs/7.x/blade#the-loop-variable
EDIT fixed html output