passwordInput("password", "Password:") creates a label and input tag
<label class="control-label" id="password-label" for="password">Password:</label>
<input id="password" type="password" class="shiny-input-password form-control shiny-bound-input" value="" data-update-on="change">
- Edge shows an eye symbol when typing inside the input-field until you focus out

- Chrome does not

This post provides more detail and also a minimal solution for all browsers. I just translated this to shiny using an actionButton and some CSS for alignments. The icon-vignette ?shiny::icon links "lists of available icons https://fontawesome.com/icons (...)". You can toggle the icon-class on a button-click, which will make it appear as if the eye is crossed-out. Feel free to change the eye-icons as per your requirements.
Code
library(shiny)
ui <- fluidPage(
div(class = "password-container", style = "display: flex; align-items: center;",
passwordInput("password", "Password:"),
actionButton("togglePassword", "",
icon = icon("eye-slash"),
style = "border: 0px; margin-top: 10px;",
class = "password-toggle",
onclick = "
// select the input text field by its ID assigned in passwordInput ('password' in this case)
const passwordField = $('#password');
const icon = $(this).find('i');
const isPassword = passwordField.attr('type') === 'password';
passwordField.attr('type', isPassword ? 'text' : 'password');
icon.toggleClass('fa-eye fa-eye-slash');
")
),
actionButton("login", "Login")
)
server <- function(input, output, session) {}
shinyApp(ui, server)

passwordInputdoesn't do what you want, why not have your owninput[type="password"]? "you can normally check with the eye icon" - only if someone has added that button and toggled totype="text".