$wpdb – do you have to use foreach even if there will always only be one result?

Read the Codex:

The get_var function returns a single variable from the database. Though only one variable is returned, the entire result of the query is cached for later use. Returns NULL if no result is found.

<?php $wpdb->get_var( 'query', column_offset, row_offset ); ?> 

So for you its:

$name = $wpdb->get_var("SELECT name FROM testTable WHERE id=1");

If you want a row use get_row:

To retrieve an entire row from a query, use get_row. The function can return the row as an object, an associative array, or as a numerically indexed array. If more than one row is returned by the query, only the specified row is returned by the function, but all rows are cached for later use. Returns NULL if no result is found, consider this when using the returned value in arguments, see example below.