Это будет зависеть от компилятора. Visual Studio 2017 недостаточно умна. Я не могу сказать, что будет делать Clang (я не использую их ежедневно), но держу пари, что они не настолько умны. Как отметил @yachoor в комментарии, «g ++ в Linux достаточно умен - он не использует атомарные операции для std :: shared_ptr, если программа не связана с pthread»
Не уверен, но стандартного способа сделать это не существует. Посмотрите на это. Вы можете использовать оператор std :: move, чтобы ссылка не увеличивалась. Если это не так, я думаю, что нет простого способа сделать это.
Относительно пункта 2 есть и другие возможности. Вы можете извлечь указатель на этот объект и передать его как ссылку везде, где это необходимо в вашей программе. Поскольку он однопоточный, вы должны быть почти уверены в сроке службы этого объекта. В противном случае вы можете переосмыслить свое владение памятью.