В общем случае сделать ссылку, открывающую профиль произвольного пользователя, или просмотреть профиль пользователя по ID (как в ICQ), не получится.
Функция протокола
getFullUser которая возвращает информацию о пользователе, принимает на вход не просто ID пользователя (как можно было бы предположить), а пару ID пользователя — access hash. Откуда берётся access_hash? Один из способов — метод resolveUsername, возвращающий пару ID пользователя — access hash по имени пользователя. Очевидно, что если пользователь не задал имя пользователя, этим методом вы не воспользуетесь.
Также access_hash содержится в контактах, в пересланных сообщениях, в списке участников чата.
Ссылки вида <a href="
tg://user?id=123456789"> в общем случае не будут работать (вернее, будут отображаться как обычный текст), если клиент Telegram не закэшировал access_hash из какого-либо источника.