R, 50 4038 bytes
-4 bytes thanks to Giuseppe.
k=scangrep();while"^[01]+$",(greplk=scan("[2-9]",F<-F+k))0;F*1:10^k)[1]*k TheIt follows from while statement goes through all multiplesthis blog post (linked in the question) that the smallest binary multiple of k and searches for any digits greater\$k\$ is smaller than 1\$2\cdot10^{k-1}\$; this answer uses the larger bound \$k\cdot10^k\$ instead. The advantage
Creates a vector of usingall multiples of grepl\$k\$ between (over\$k\$ and utf8ToInt or\$k\cdot10^k\$. The regexp gives the indices of those made only of 0s and 1s; select the first index and multiply by strsplit) is that it accepts integer\$k\$ to get the answer.
Will time out on TIO for input and convertsgreater than 8, but with infinite memory it to stringwould work for any input.