Are Shortcode Attributes Always Passed As Strings?

Yes, shortcode attributes are always strings. WordPress has no way of knowing the intended type of each attribute, and the values are ultimately pulled from an HTML string, after all.

If you need $id to be an integer, just do this:

$args = ( shortcode_atts( array('id' => ''), $atts ) );
$id   = (int) $args['id'];


if ( ! $id ) {
     return;
}

$content = get_reusable_block( $id );